Solved

Shell script with awk to extract substring

Posted on 2011-03-15
13
3,777 Views
Last Modified: 2013-12-26
I am modifying my .profile on an AIX system so it will capture my IP Address into a variable and then export it as my env variable DISPLAY.

Below is code that works but the last octet of the IP address can be one, two or three digits long.  If it is less than three digits, I want to suppress the trailing space before I concatenate additional stuff.

The value of the variables are as follows:
SSH_CLIENT is an ip address and  additional information as follows:
SSH_CLIENT=192.168.110.31 1234 56

with the code below, I am able to extract into my_ipadr as follows:
my_ipadr=192.168.110.31 :0.0 (with a trailing space after the 31 and before the:0.0)

When I concatenate the last part, the space becomes a problem. WHen it is assigned to the DISPLAY variable it looks like this:
DISPLAY=192.168.110.31 :0.0
complete with the space between 31 and :0.0

How can I "trim" the space off prior to concatenation?  I can't change the substr command so it only picks up two numbers because it is possible for it to be three numbers.  and if it is only one number then I will have two spaces.

I have toyed with the # (sharp) character, but have only gotten errors.

Thanks in advance.

my_ipadr=$(echo $SSH_CLIENT | awk -F. '{print $1"."$2"."$3"."substr($4,1,3)":0.0"}')
echo $my_ipadr
export DISPLAY=$my_ipadr

Open in new window

0
Comment
Question by:Fhnorth
  • 5
  • 5
  • 3
13 Comments
 
LVL 31

Accepted Solution

by:
farzanj earned 125 total points
ID: 35143012
A quick fix

my_ipadr=$(echo $SSH_CLIENT | awk -F. '{print $1"."$2"."$3"."substr($4,1,3)":0.0"}' | sed 's/ //g')
0
 
LVL 68

Expert Comment

by:woolmilkporc
ID: 35143019
my_ipadr=$(echo $SSH_CLIENT | awk '{print $1 "0:0"}')
0
 
LVL 68

Expert Comment

by:woolmilkporc
ID: 35143046
Sorry, typo:

my_ipadr=$(echo $SSH_CLIENT | awk '{print $1 ":0.0"}')
0
Best Practices: Disaster Recovery Testing

Besides backup, any IT division should have a disaster recovery plan. You will find a few tips below relating to the development of such a plan and to what issues one should pay special attention in the course of backup planning.

 
LVL 68

Assisted Solution

by:woolmilkporc
woolmilkporc earned 125 total points
ID: 35143181
And the simplest method:

export DISPLAY=${SSH_CLIENT%%" "*}:0.0

or, if you prefer:

my_ipadr=${SSH_CLIENT%%" "*}:0.0
echo $my_ipadr
export DISPLAY=$my_ipadr

wmp
0
 

Author Comment

by:Fhnorth
ID: 35143183
farzanj,

Your script works perfectly.
I am not educated in sed, so I need to ask will this work even if the last octet of the IP address is three numbers?  For example:
192.168.110.1101234 56

I believe your solution is exactly what I need... but first I need to ask a question of woolmilkporc...


woolmilkporc,

Your script works perfectly also.

So I may have a problem with using the -F switch?  I am new to awk.  It would appear that if I omit the -F switch, it parses the string differently.  Does it depend upon finding a space, using the space as a delimiter?  I notice that with my original script with the -F, it uses the "." (period) as a delimiter.

If that is the case, when the last octet is three numbers, it will look like this:
192.168.110.1101234 56 (with no space between the fourth octet and the additional number at the end of the string (1234 56).  Is this going to present a problem?
0
 
LVL 68

Expert Comment

by:woolmilkporc
ID: 35143203
Without -F the space is the delimiter.

$1 is the string up to, but not including, the first space, and $1 will of course contain nothing that follows this space (that would be $2 etc.)
0
 

Author Comment

by:Fhnorth
ID: 35143205
woolmilkporc,

I posted my last comment at the same time you posted yours.  So, with the easier "one liner", I have to ask the same question...
0
 

Author Comment

by:Fhnorth
ID: 35143217
Well then it won't work with no space after the fourth octet, as in my example in my second post...?
0
 
LVL 68

Expert Comment

by:woolmilkporc
ID: 35143244
The string in your second post will never appear in $SSH_CLIENT (there will always be a space following the IP address, regardless of the number of digits in the fourth octet).

So why would you construct a problem where there is actually none?

My second solution uses "inline variable editing"

%%" "* means delete (starting from the right) the first space and all that follows,
0
 

Author Comment

by:Fhnorth
ID: 35143281
I did not know that there would always be a space between the fourth octet and the other numbers.  I am obviously new to the SSH_CLIENT environment variable as well.

Thanks to both of you.  You both have excellent solutions and I am awarding each of you half of the points.

Thanks again!  I REALLY appreciate the help.
0
 
LVL 31

Expert Comment

by:farzanj
ID: 35143347
My sed command would work no matter what.  It is only erasing any spaces, anywhere, nothing else.
0
 

Author Comment

by:Fhnorth
ID: 35143441
farzanj,

Yes, I know!  Your script is the one that I favor and am using.  I favor it for that VERY reason.  I have tested both of them and found that with woolmilkporc's script, it has a problem if there is no space for a delimiter.  He assures me that the SSH_CLIENT variable will never have a space, but I'd rather be safe than sorry.

Thanks much!
0
 
LVL 31

Expert Comment

by:farzanj
ID: 35143611
You are most welcome.  Glad you liked it.

0

Featured Post

The Eight Noble Truths of Backup and Recovery

How can IT departments tackle the challenges of a Big Data world? This white paper provides a roadmap to success and helps companies ensure that all their data is safe and secure, no matter if it resides on-premise with physical or virtual machines or in the cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Since upgrading to Office 2013 or higher installing the Smart Indenter addin will fail. This article will explain how to install it so it will work regardless of the Office version installed.
If you’re thinking to yourself “That description sounds a lot like two people doing the work that one could accomplish,” you’re not alone.
In this fourth video of the Xpdf series, we discuss and demonstrate the PDFinfo utility, which retrieves the contents of a PDF's Info Dictionary, as well as some other information, including the page count. We show how to isolate the page count in a…
In this fifth video of the Xpdf series, we discuss and demonstrate the PDFdetach utility, which is able to list and, more importantly, extract attachments that are embedded in PDF files. It does this via a command line interface, making it suitable …

773 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question