help-gnu-utils
[Top][All Lists]
Advanced

[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.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]