Getting lines before and until next pattern in file /awk, sed


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Getting lines before and until next pattern in file /awk, sed
# 8  
Old 10-13-2012
Quote:
Originally Posted by msabhi
Code:
awk '/IP *= *1\.1\.1\.1/ {print;while($0!~ /SNMP-END/){getline;print;}}' input_file

or
as Don Cragun has pointed out use nawk
Code:
nawk '/IP *= *1\.1\.1\.1/ {print;while($0!~ /SNMP-END/){getline;print;}}'  input_file

It might be a bit easier to do it with "sed" - at least it is shorter to write:

Code:
sed -n '/^IP *= *1\.1\.1\.1/,/SNMP-END/p'

I hope this helps.

bakunin
# 9  
Old 10-14-2012
Quote:
Originally Posted by msabhi
Code:
awk '/IP *= *1\.1\.1\.1/ {print;while($0!~ /SNMP-END/){getline;print;}}' input_file

or
as Don Cragun has pointed out use nawk
Code:
nawk '/IP *= *1\.1\.1\.1/ {print;while($0!~ /SNMP-END/){getline;print;}}'  input_file

What is the meaning of....
while($0!~ /SNMP-END/). ??

I know what it is doing, but I don't understand the $0!...

Thanks
# 10  
Old 10-14-2012
! indicates not.
like !=--> Not equal to
like !~--> Not contains

And

$0!~ /SNMP-END/ means $0 not contains /SNMP-END/. It is true when line not containing search criteria..

Hope this helps youSmilie
# 11  
Old 10-24-2012
Additional issue

Hi,

Now I need to add something else to the command, the current one works just great, but I need to ... get some number of lines before and read to the end.

awk '/IP *= *1\.1\.1\.1/ {print;while($0!~ /SNMP-END/){getline;print;}}' input_file
That will look for 1.1.1.1 and will read until SNMP-END, but I will need to get the whole block, adding also the SNMP-ST for the groups including 1.1.1.1

If someone can help, it will be great.

Thanks,
# 12  
Old 10-24-2012
Code:
perl -lne '{if(/SNMP-ST/){$#A=-1;$f=1;}
if(/IP/){$f=(/1\.1\.1\.1/)?1:0;}if(/SNMP-END/ && ($f)){print join("\n",@A,$_);next}($f)?push(@A,$_):next;}' input_file

This User Gave Thanks to msabhi For This Post:
# 13  
Old 10-24-2012
holy guacamole!!! .. that was great!

thanks
# 14  
Old 10-24-2012
You can do it in sed (which is probably faster than PERL) with the following algorithm: collect all lines, starting from the beginning of a block to and ending with the end of a block, in a buffer. Then print only the blocks which contain the search string and clear the buffer then, regardless of it being printed or not:

Code:
sed -n '/\*\*\*SNMP-ST\*\*\*/,/\*\*\*SNMP-END\*\*\*/N
        /\*\*\*SNMP-END\*\*\*/ {
             /IP *= *1\.1\.1\.1\./p
             d
        }' /path/to/infile

I hope this helps.

bakunin
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

awk with sed to combine lines and remove specific odd # pattern from line

In the awk piped to sed below I am trying to format file by removing the odd xxxx_digits and whitespace after, then move the even xxxx_digit to the line above it and add a space between them. There may be multiple lines in file but they are in the same format. The Filename_ID line is the last line... (4 Replies)
Discussion started by: cmccabe
4 Replies

2. UNIX for Beginners Questions & Answers

Sed/awk join lines once pattern found

Hi all OS - RHEL6.4 I have input file -f1.txt I need to search line which starts with \Start and read next line till it gets blank line and join them all. I need to trim any trailing spaces for each line.So output.txt should be.. \Start\now\fine stepwatch this space for toolsends... (7 Replies)
Discussion started by: krsnadasa
7 Replies

3. Shell Programming and Scripting

Using awk or sed to find a pattern that has lines before and after it

Dear gurus, Please help this beginner to write and understand the required script. I am looking for useing awk for sed. I have a few thousand lines file whose contain are mostly as below and I am trying to achieve followings. 1. Find a string, say user1. Then hash the line containing the... (6 Replies)
Discussion started by: ran_bon_78
6 Replies

4. Shell Programming and Scripting

sed -- Find pattern -- print remainder -- plus lines up to pattern -- Minus pattern

The intended result should be : PDF converters 'empty line' gpdftext and pdftotext?xml version="1.0"?> xml:space="preserve"><note-content version="0.1" xmlns:/tomboy/link" xmlns:size="http://beatniksoftware.com/tomboy/size">PDF converters gpdftext and pdftotext</note-content>... (9 Replies)
Discussion started by: Klasform
9 Replies

5. Shell Programming and Scripting

Replacing lines matching a multi-line pattern (sed/perl/awk)

Dear Unix Forums, I am hoping you can help me with a pattern matching problem. What am I trying to do? I want to replace multiple lines of a text file (that match a multi-line pattern) with a single line of text. These patterns can span several lines and do not always have the same number of... (10 Replies)
Discussion started by: thefang
10 Replies

6. Shell Programming and Scripting

Sed/awk/perl command to replace pattern in multiple lines

Hi I know sed and awk has options to give range of line numbers, but I need to replace pattern in specific lines Something like sed -e '1s,14s,26s/pattern/new pattern/' file name Can somebody help me in this.... I am fine with see/awk/perl Thank you in advance (9 Replies)
Discussion started by: dani777
9 Replies

7. Shell Programming and Scripting

How to print the lines between the pattern using awk/grep/sed?

Hi, I need a help to search a pattern and print the multiple lines between them. Input file: Tue May 29 12:30:33 EDT 2012:threadWebContainer : 357:com.travimp.hotelierlinks.abba.service.RequestHandler.requestService(String, ITICSDataSet): hotelCancelReservation request: ... (4 Replies)
Discussion started by: aroragaurav.84
4 Replies

8. Shell Programming and Scripting

sed/awk : how to delete lines based on IP pattern ?

Hi, I would like to delete lines in /etc/hosts on few workstations, basically I want to delete all the lines for a list of machines like this : for HOST in $(cat stations.lst |uniq) do # echo -n "$HOST" if ping -c 1 $HOST > /dev/null 2>&1 then HOSTNAME_val=`rsh $HOST "sed... (3 Replies)
Discussion started by: albator1932
3 Replies

9. Shell Programming and Scripting

sed/awk to insert multiple lines before pattern

I'm attempting to insert multiple lines before a line matching a given search pattern. These lines are generated in a separate function and can either be piped in as stdout or read from a temporary file. I've been able to insert the lines from a file after the pattern using: sed -i '/pattern/... (2 Replies)
Discussion started by: zksailor534
2 Replies

10. Shell Programming and Scripting

How to awk/sed/grep lines which contains a pattern at a given position

Dear friends I am new to linux and was trying to split some files userwise in our linux server. I have a data file of 156 continuous columns named ecscr final. I want the script to redirect all the lines containing a pattern of 7 digits to separate files. I was using grep to do that,... (2 Replies)
Discussion started by: anoopvraj
2 Replies
Login or Register to Ask a Question