Use of sed/awk


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Use of sed/awk
# 8  
Old 03-04-2009
Hi radoulov,

thanks a lot

i have got one more query

i have one file cpu and its content are:

Data Collected: 05/17/08 17:19:49

Refresh Interval: 600 seconds

GlancePlus Started/Reset: 05/17/08 08:19:45
B3692A GlancePlus C.03.72.00 17:29:49 UXAMSK01 9000/800 Current Avg High
-------------------------------------------------------------------------------
CPU Util SSUUUUU | 16% 9% 22%
Disk Util F | 1% 5% 12%
Mem Util SSSSSSSSSSUUUUUUUUBBBBB | 46% 45% 46%
Swap Util UUUURRRRR | 17% 16% 17%
-------------------------------------------------------------------------------
IO BY FILE SYSTEM Users= 8
Idx File System Device Type Logl IO Phys IO
--------------------------------------------------------------------------------
1 / /dev/vg00/lvol3 vxfs 24.8/ 25.1 0.5/ 0.5
2 /stand /dev/vg00/lvol1 hfs 0.0/ 0.0 0.0/ 0.0
3 /var /dev/vg00/lvol8 vxfs 0.2/ 0.3 1.9/ 2.1
4 /usr /dev/vg00/lvol7 vxfs 35.2/ 17.7 0.9/ 0.7

Top disk user: PID 11053, s_server 10.0 IOs/sec S - Select a Disk


Now i m using this code

sed -n '1p;8,10 {;s/^\([^ ]*\) [^0-9]*\([0-9]*%\).*$/\1 \2/p;}' cpu

to get output as:

Data Collected: 05/17/08 17:19:49
CPU 16%
Disk 1%
Mem 46%

i want to know few things about this code as to how it works
{;s/^\([^ ]*\) [^0-9]*\([0-9]*%\).*$/\1 \2/p;};
specially difference between ^ individually and like this [^ ]* and in this case
how it will directly take the second part of output i.e the % part bcoz in line 8-10
the % part comes after delimeter '|' so how does it actually work

and [^0-9]*\([0-9]*%) does it mean starting from 0-9 any character followed by 0-9 any charcter with % symbol

and what does this .*$ mean

and lastly this \1 \2/p;}; how does it work

Please help me





s/^\([^ ]*\)
# 9  
Old 03-04-2009
Seems cut just doesn't cut it nowadays Smilie

Code:
$ cut -d"/" -f3 < infile | cut -d":" -f1
name1
name2
name3

# 10  
Old 03-06-2009
Quote:
i want to know few things about this code as to how it works
{;s/^\([^ ]*\) [^0-9]*\([0-9]*%\).*$/\1 \2/p;};
specially difference between ^ individually and like this [^ ]* and in this case
how it will directly take the second part of output i.e the % part bcoz in line 8-10
the % part comes after delimeter '|' so how does it actually work

and [^0-9]*\([0-9]*%) does it mean starting from 0-9 any character followed by 0-9 any charcter with % symbol

and what does this .*$ mean

and lastly this \1 \2/p;}; how does it work
The difference between ^ and [^] is that in the first case the caret ^ is a meta-character that matches the beginning of the line
(it's a zero-length match, it matches the empty space at the beginning of the string, not the first character of the string).

The $ character matches the end of the line/string.

They are called anchors.

In the second case the brackets [] denote a character class. If the first character of the list is the caret ^ then it matches any character not in the list,
so [^ ] matches any character different than a space (you have a space after the ^ character).

In this case we have:

Code:
 ^\([^ ]*\)

The first group of parentheses () saves any number of occurrences (because of the * after the complemented character class [^ ])
of non-space characters [^ ]. As far as the following string is concerned:

Code:
CPU Util SSUUUUU | 16% 9% 22%

It's the following string:

Code:
CPU

Followed by:

Code:
 [^0-9]*\([0-9]*%\).*$

A space, any number of occurrences of the following complemented character class [^0-9], i.e., any non-digit character. In this case the string:

Code:
 Util SSUUUUU |

Then we save the string matching the following regular expression:

Code:
\([0-9]*%\).*$

any number of occurrences (*) of the indicated character class [0-9] - only digits, followed by the % character,
followed by any number of occurrences (*) of any character . (dot).

It's the following string:

Code:
16%

You can refer to the previously saved matches using the spacial syntax \1, \2 and so on.

Hope this helps.
# 11  
Old 03-07-2009
Hi radoulov,

when we have given this ([^ ]*\) in our code it will search for any charcter different than space so according to that
our output should be this

CPU Util SSUUUUU | 16% 9% 22%

how its coming to only
CPU

similarly in this part [^0-9]*\([0-9]*%\).*$
we are first searching for any charcter different than 0-9 so the output should be

CPU Util SSUUUUU |

after that it searches for 0-9 with %
so the output should be

16% 9% 22%

and how its coming

16%

and thanks for the earlier response
it cleared many doubts of mine
but still have some doubts that i would like to clear

thanks
haris
# 12  
Old 03-07-2009
and radoulov u mentioned any number of occurrences with the help of *

but in this case ([^ ]*\) it will match for any character different than space
that means entire string of ours that is

CPU Util SSUUUUU | 16% 9% 22%

than why you have written only

CPU

how did we get that
similarly for ([0-9]*%\).*
please explain this in detail

thanks
haris
# 13  
Old 03-07-2009
Quote:
Originally Posted by haris
Hi radoulov,

when we have given this ([^ ]*\) in our code it will search for any charcter different than space so according to that
our output should be this

CPU Util SSUUUUU | 16% 9% 22%

how its coming to only
CPU
So, we have three characters different than a space and then a space: C, P, U and space, so from 0 to infinity no-space characters, the longest match is CPU:

Code:
% print 'CPU Util SSUUUUU | 16% 9% 22%'|sed -r 's/^([^ ]*).*/-->\1<--/'  
-->CPU<--

Quote:
similarly in this part [^0-9]*\([0-9]*%\).*$
we are first searching for any charcter different than 0-9 so the output should be

CPU Util SSUUUUU |

after that it searches for 0-9 with %
so the output should be

16% 9% 22%

and how its coming

16%
First of all, when the sed regular expressions engine tries to match that pattern, the string CPU is already consumed by the first match.
So it now is trying to match from the space that follows the string CPU onwards and, considering the string above, we have: a space, U, t, i, l, a space, S, S, U, U, U, U, U, one more space, pipe and another space and this string is matched by the following regular expression: [^0-9]*:

Code:
% print 'CPU Util SSUUUUU | 16% 9% 22%'|sed -r 's/^([^ ]*)( [^0-9]*).*/-->\1<-- -->\2<--/'
-->CPU<-- --> Util SSUUUUU | <--

And now the final part: [0-9]*%. The sed regular expressions engine is searching from the space after the pipe (excluding the space itself) onwards. It tries to match any number of digits followed by the % character, so it matches only 16%:

Code:
% print 'CPU Util SSUUUUU | 16% 9% 22%' |
  sed -r '
    s/^([^ ]*)( [^0-9]*)([0-9]*%).*$/-->\1<-- -->\2<-- -->\3<--/
'
-->CPU<-- --> Util SSUUUUU | <-- -->16%<--

If we had included a space and the % character in our character class, we would have matched the entire string,
leaving nothing for the last .*$ part:

Code:
% print 'CPU Util SSUUUUU | 16% 9% 22%' |
  sed -r '
    s/^([^ ]*)( [^0-9]*)([0-9 %]*%)(.*$)/-->\1<-- -->\2<-- -->\3<-- -->\4<--/
'                                                                           
-->CPU<-- --> Util SSUUUUU | <-- -->16% 9% 22%<-- --><--

Because the * mean 0 or more. If we force the last regular expression to match 1 or more[1] (not 0 or more) characters,
the result will be different:

Code:
% print 'CPU Util SSUUUUU | 16% 9% 22%' |
  sed -r '
    s/^([^ ]*)( [^0-9]*)([0-9 %]*%)(.+)$/-->\1<-- -->\2<-- -->\3<-- -->\4<--/
'                                                                           
-->CPU<-- --> Util SSUUUUU | <-- -->16% 9%<-- --> 22%<--

[1]. Only a few sed implementations support extended regular expressions (the + quantifier).

Last edited by radoulov; 03-07-2009 at 06:43 PM..
# 14  
Old 03-07-2009
if you have bash
Code:
while read line
do
 line=${line##*/}
 line=${line%:*}
 echo $line
done < file

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

sed and awk giving error ./sample.sh: line 13: sed: command not found

Hi, I am running a script sample.sh in bash environment .In the script i am using sed and awk commands which when executed individually from terminal they are getting executed normally but when i give these sed and awk commands in the script it is giving the below errors :- ./sample.sh: line... (12 Replies)
Discussion started by: satishmallidi
12 Replies

2. Shell Programming and Scripting

Is this possible using SED and AWK?

Dear Geeks, I want to manipulate a file with certain modifications for that using sed or AWK how to do this process for one file i have this type of data. Input File: "Restricted and Reserved names .ANISH",3798,"TEST.CO",1201208,6/16/10 0:00,6/16/13 0:00,,,"CO","2nd"^M "Restricted and... (4 Replies)
Discussion started by: anishkumarv
4 Replies

3. UNIX for Dummies Questions & Answers

sed/awk or help please

I have a file that contain the data below: B1 1 2 3 B2 20 30 40 B3 7 8 B4 100 B5 21 22 23How can I retrieve the data for B1 into a seperate file. (8 Replies)
Discussion started by: bobo
8 Replies

4. Shell Programming and Scripting

Need help using awk or sed.

Hi All, Is there a way of comparing two columns in the same file and deleting the row if the values of the columns match. I have the sample data file as below. M024900|175309.00|968.00|17 M025001|19861.79|97.90|148 M025002|431.70|159.00|3 M025003|912.30|159.90|6 ... (6 Replies)
Discussion started by: nua7
6 Replies

5. Shell Programming and Scripting

Using sed or awk?

What if I wanted to add a word such as IT after the first character and if theres 3 characters, after the 2nd character? output would be: G, it H G, H it P G, H, P it L I'm thinking that AWK would be the easiest way to do this... Currently looking it up. Right now I'm using awk but I... (13 Replies)
Discussion started by: puttster
13 Replies

6. UNIX for Dummies Questions & Answers

sed or awk?

I've got an inventory database with eight columns with things like product name, manufacturer, UPC code, etc. on each line. Our PO (purchase order) number is in the first column. I can grep the date and get the full line of data but I would like to strip out everything but the PO number in the... (5 Replies)
Discussion started by: NetJones
5 Replies

7. UNIX for Advanced & Expert Users

Awk or Sed help

Hi, I have a data file with 5 columns - like this: "20080401 09:43:08.770798 +0100s","TEST 1","R 1","A TEST","Nov 27 2007","1" "20080401 09:43:08.770798 +0100s","THIS IS A TEST","R 2","B TEST","Nov 30 2007","10" "20080401 09:43:08.770798 +0100s","ANOTHER TEST","R 3","B TEST","Nov 05... (7 Replies)
Discussion started by: MrG-San
7 Replies

8. UNIX for Advanced & Expert Users

sed in awk ? or nested awk ?

Hey all, Can I put sed command inside the awk action ?? If not then can i do grep in the awk action ?? For ex: awk '$1=="174" { ppid=($2) ; sed -n '/$ppid/p' tempfind.txt ; }' tempfind.txt Assume: 174 is string. Assume: tempfind.txt is used for awk and sed both. tempfind.txt... (11 Replies)
Discussion started by: varungupta
11 Replies

9. Shell Programming and Scripting

sed,awk

Hi, I know sed is stream text editor and not a bit more than that. Can anyone explain its usage and advantages? How is awk different from sed? I donno i am a bit confused about it. But i have coded in awk and shell. Thanks, Nisha :confused: (7 Replies)
Discussion started by: Nisha
7 Replies

10. Shell Programming and Scripting

awk / sed

I have many messages such as the test message below: 00:00000:00021:2002/05/13 13:57:00.51 ERROR:- Test error, my test error!!! I am writing a script in which I need to get everything from the word "ERROR:-" onwards. I normally use awk for these things, but I am not an expert at it so i am... (6 Replies)
Discussion started by: baileyr1
6 Replies
Login or Register to Ask a Question