dannyman.toldme.com


Technical

sh: “split” Shortcut

Recently, I wrote a shell script that had to break an IP address into octets. I wrote:


# octects
oct1=`echo $subnet | awk -F . '{print $1}'`
oct2=`echo $subnet | awk -F . '{print $2}'`
oct3=`echo $subnet | awk -F . '{print $3}'`
oct4=`echo $subnet | awk -F . '{print $4}'`

Later, when reviewing my script, Anonymous Coward offered this little gem:


$ set `echo 10.20.30.40 | tr '.' ' '`
$ echo $1
10
$ echo $2
20
$ echo $3
30
$ echo $4
40

Which means, you can just set a series of variables to $1, $2, $3, and so forth. In Anon’s example, the IP address is split into words with tr, and the variables set nice and easy with set.

Of course, if your script gets complex, you probably want to avoid relying on those variables. My original code could be re-expressed:


set `echo $subnet | tr '.' ' '`
oct1=$1; oct2=$2; oct3=$3; oct4=$4

Much nicer than invoking awk several times.

Read More

Next:
Previous:
Categories: Technical
Possibly-Related Posts

Responses

August 23rd, 2007

((meatspace)) » shell split

[…] Dannyman sez: # octects oct1=`echo $subnet | awk -F . ‘{print $1}’` oct2=`echo $subnet | awk -F . ‘{print $2}’` oct3=`echo $subnet | awk -F . ‘{print $3}’` oct4=`echo $subnet | awk -F . ‘{print $4}’` […]

August 23rd, 2007

dbt

Dude, use IFS. I blohhgged it.

December 11th, 2007

geoff

within awk;

echo 192.168.1.1|awk ‘{gsub(/\./,” “);print “1oct:”$1″ 2oct:”$2″ 3oct:”$3 ” 4oct:”$4}’

maybe convert to an int;

echo 192.168.1.1|awk ‘{gsub(/\./,” “);printf “%d”, 16777216*$1 + 65536*$2 + 256*$3 + $4}’

Comment

Leave a comment . . .

Tiny Print:

  1. For private messages, e-mail me: dannyman@toldme.com.
  2. You must provide an e-mail address.
  3. You can use a bogus e-mail address, but I like to know who you are.
  4. I will not spam you. I will not publish or share your e-mail address.
  5. First-time commenters will be held for review.
  6. You can use these HTML tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>