[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Specifying multiple separators via FS or the -F command line flag
From: |
Bob Proulx |
Subject: |
Re: Specifying multiple separators via FS or the -F command line flag |
Date: |
Mon, 3 Dec 2007 22:03:55 -0700 |
User-agent: |
Mutt/1.5.13 (2006-08-11) |
cga2000 wrote:
> backtick 4 0 0 awk -F "[: ]" 'BEGIN \
> {file="/proc/net/dev";while(a==a){while(getline<file!=0){if \
> ($3=="eth0"){d=$4;u=$12;printf " %4.1f k/s ",((d-dp)/1024);printf \
> "%4.1f k/s\n",((u-up)/1024)}};close(file);dp=d;up=u;system("sleep \
> 1")}}'
Oh, gosh, that is hard to read! But of course you already knew that. :-)
> NB. I do realize that when one-liners get to be this long it's probably
> time to move them to a file :-)
Yes.
> lo:649004371 349860 0 0 0 0 0
> eth0:673423996 22297294 789 0 1100 789 0 <-
> When I bring up the interface the byte counter is separated from
> field "eth0:" by a number of spaces.
> After a while as the value become larger, and eventually all the
> spaces disappear to make room for the increased number of bytes.
I tend to pre-process these cases to guarantee space separation.
line=' eth0:673423996 22297294 789 0 1100 789 0'
echo "$line" | awk '{sub(/(eth[[:digit:]]|lo):/,"& ");print $2}'
673423996
line=' lo:649004371 349860 0 0 0 0 0'
echo "$line" | awk '{sub(/(eth[[:digit:]]|lo):/,"& ");print $2}'
673423996
I would try that technique. Here I have used an ERE to match either
of the cases presented. It is still not very general though. I would
tend to get the list of devices dynamically.
I don't know if this is a great way to do this but so far I have
noticed that every type of system I have tried reports header lines in
capital letters. I can use this to detect which lines are device
lines.
netstat -ni | awk '/^[[:lower:]]/{print$1}' | sort -u
eth1
eth2
lo
I would probably use that to build the match regular expression. But
I will leave that as an exercise for the reader. :-)
> I thought I'd use the above to illustrate my problem rather than a test
> file as Bob Proulx suggested in his reply to my initial post in the
> bug-gnu-utils list because I have no knowledge of awk apart from reading
> through an online tutorial a couple of months ago and I might have made
> some assumptions that would have confused the issue further.
But the full case is often very intimidating. That big block of awk
one-liner is too dense. It scares people off.
I would tend not to use "only" awk here. My own preference is to use
shell scripts and use awk in pieces. Also, instead of parsing /proc I
would use netstat because it is more portable. I am not going to
finish this off but you can see where I am going with this:
netstat -ni | awk '/^[[:lower:]]/{print$1,$4}'
Hope that helps,
Bob