[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: |
cga2000 |
Subject: |
Re: Specifying multiple separators via FS or the -F command line flag |
Date: |
Tue, 04 Dec 2007 20:17:35 -0500 |
User-agent: |
Mutt/1.5.13 (2006-08-11) |
On Tue, Dec 04, 2007 at 12:03:55AM EST, Bob Proulx wrote:
> 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. :-)
That's why I had a link to that geocities site of "mine" .. with all
the screen backticks .. on one line they look a bit better.
> > 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 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.
I wonder if I could write this as a bash function.
> Also, instead of parsing /proc I would use netstat because it is more
> portable.
Looks like using netstat actually solves all the annoying parsing issues
as well .. since the output is (hopefully) always "neat" with the byte
counters in the right places?
> 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}'
I'll rewrite it next weekend with netstat providing the data in a more
manageable format.
Thank you very much for all your help.