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.