How to get lines in between Patterns?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting How to get lines in between Patterns?
# 1  
Old 04-23-2008
How to get lines in between Patterns?

Hi,

I need to create a script that does the following:

1. Read the file for the occurrences of "EXECUTE" and "END" strings.
There will be several occurrences of EXECUTE and END strings on the file.
2. The resulting lines in #1, needs to be searched for the word "Error|failed|error|warning", if the word error occurs on the line, prints the specific line and 1 line above it.

Here's a sample input file:
HTML Code:
-------------------------------< EXECUTE >----------------------------
This session consists of:  Feature  R-state        Install-type Upgrade-from

------------------------------------------------------------------------  
conf_system                              R3C01          upgrade      R3B03     
------------------------------------------------------------------------
------------------< CIF(conf) 2008-04-08 02:31:28 >--------------------
----------------------< END 2008-04-08 02:31:57 >---------------------

-------------------------------< EXECUTE >-----------------------------
---------< FM(fm_core,fmba,fmaa,fmx,fmav) 2008-04-08 03:14:09 >-------
[main] Error installing feature [fmx] - com.er.nm.if.ist.NoMatchingUpgradeClauseFoundException: 
--------------------------< END 2008-04-08 03:22:51 >------------------

The output should be:
HTML Code:
---------< FM(fm_core,fmba,fmaa,fmx,fmav) 2008-04-08 03:14:09 >-------
[main] Error installing feature [fmx] - com.er.nm.if.ist.NoMatchingUpgradeClauseFoundException: 

I'm not familiar with awk command, and if you can guide me on this please?
Any help is greatly appreciated.

//racbern
# 2  
Old 04-23-2008
try this

#! /usr/bin/ksh

cat linebetween.d | awk '
/EXECUTE/ { start = 1; nextline=1; continue }
/END/ { start = 0 ; continue}
(/Error/ || /failed/ || /error/ || /warning/) && start == 1 { print hesderline; print $0 }
{ if (nextline == 1 ) {hesderline = $0; nextline=0}}
'
# 3  
Old 04-23-2008
Hi aju_kup,

Thanks for your quick reply.

I tried your suggestion, and it only prints the lines with the patterns "Error|failed|error|warning". I need to get also the line above it.


I did some trial and error of the awk command and come out with the following (but I dont know how to get the line above it):

# awk '/EXECUTE/,/END/ { if ($0 ~ /Error installing/) print $0}' /var/tmp/llsva.log


//racbern
# 4  
Old 04-23-2008
#! /usr/bin/ksh

cat linebetween.d | awk '
/EXECUTE/ { start = 1; continue }
/END/ { start = 0 ; continue}
(/Error/ || /failed/ || /error/ || /warning/) && start == 1 { print pline; print $0 }
{ pline = $0}
'
# 5  
Old 04-23-2008
Hi aju kup,

Thanks for your quick reply.

Can you explain me the code as well please?


//racbern
# 6  
Old 04-23-2008
The cat is useless, of course, and you can combine all those search expressions into one big ole regular expression:

Code:
awk '/EXECUTE/ { start = 1; continue }
/END/ { start = 0; continue }
start && /[Ee]rror|failed|warning/ { print pline; print }
{ pline = $0 }' file

The essential point is that pline captures the previous line when it wasn't printed; and start is true when you have seen an EXECUTE but not yet an END. So when start is true and the regular expression matches, you print the previous line and the current line.
# 7  
Old 04-23-2008
Hi era,

Thanks for reply as well.
I added == 1 on your suggestion, and it worked fine as well.

awk '/EXECUTE/ { start = 1; continue }
/END/ { start = 0; continue }
start == 1 && /[Ee]rror|failed|warning/ { print pline; print }
{ pline = $0 }' file

Is there a way I can assign the pline to a variable, so that I can manipulate it afterwards?

Thanks again..

//racbern
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

How to print lines from a files with specific start and end patterns and pick only the last lines?

Hi, I need to print lines which are matching with start pattern "SELECT" and END PATTERN ";" and only select the last "select" statement including the ";" . I have attached sample input file and the desired input should be as: INPUT FORMAT: SELECT ABCD, DEFGH, DFGHJ, JKLMN, AXCVB,... (5 Replies)
Discussion started by: nani2019
5 Replies

2. UNIX for Beginners Questions & Answers

Delete multiple lines between blank lines containing two patterns

Hi all, I'm looking for a way (sed or awk) to delete multiple lines between blank lines containing two patterns ex: user: alpha parameter_1 = 15 parameter_2 = 1 parameter_3 = 0 user: alpha parameter_1 = 15 parameter_2 = 1 parameter_3 = 0 user: alpha parameter_1 = 16... (3 Replies)
Discussion started by: ce9888
3 Replies

3. Shell Programming and Scripting

Search for patterns on different lines

im using the following code to search a log for entries on two different lines: awk 'BEGIN{count=0} /'"${firstpattern}"'/,/'"${secondpattern}"'/ { print; if ($0 ~ /'"${thirdpattern}"'/){count++}; } END { print count }' data.txt firstpattern="start error log" secondpattern="i am logging the... (1 Reply)
Discussion started by: SkySmart
1 Replies

4. Shell Programming and Scripting

Extract lines between patterns

I have a list in the format below, how do I read through the list and extract the lines between the ##START## and ##END##, so i can check for specific values between each ##START## & ##END## pattern ##START## RANDOMTEXT DFGSD SDFSDF ##END## ##START## morestuff sdfggfg sdfsdf... (10 Replies)
Discussion started by: squrcles
10 Replies

5. Shell Programming and Scripting

How to print only lines in between patterns?

Hi, I want to print only lines (green-italic lines) in between first and last strings in column 9. there are different number of lines between each strings. 10 AUGUSTUS exon 4558 4669 . - . 10.g1 10 AUGUSTUS exon 8771 8889 . ... (6 Replies)
Discussion started by: jamo
6 Replies

6. Shell Programming and Scripting

Need to print between patterns AND a few lines before

I need to print out sections (varying numbers of lines) of a file between patterns. That alone is easy enough: sed -n '/START/,/STOP/' I also need the 3 lines BEFORE the start pattern. That alone is easy enough: grep -B3 START But I can't seem to combine the two so that I get everything between the... (2 Replies)
Discussion started by: Finja
2 Replies

7. Shell Programming and Scripting

Deleting lines above the patterns

I want to delete 1 line above the paatern and 3 line below the pattern and the pattern line itself, on the whole 5 lines. If there are three patterns what to do and the final text file to be captured in a new file. (3 Replies)
Discussion started by: razen
3 Replies

8. Shell Programming and Scripting

How can I get the lines between two patterns?

hi, I have the following file hello world this is to say bye to everyone so bye I want to get the lines from hello to the first bye inclusive into another file? how can I do this (11 Replies)
Discussion started by: JamesByars
11 Replies

9. Shell Programming and Scripting

Searching patterns in 1 file and deleting all lines with those patterns in 2nd file

Hi Gurus, I have a file say for ex. file1 which has 3500 lines in it which are different account numbers and another file (file2) which has 230000 lines in it. I want to read all the lines in file1 and delete all those lines from file2 which has that same pattern as in file1. I am not quite... (4 Replies)
Discussion started by: toms
4 Replies

10. Shell Programming and Scripting

Grep All lines between 2 different patterns

I need a simple script to get all lines between 2 Patterns, e.g. ............. ............. 114456723: testing Script Alpha Beta 114459234: testing Done ............. ............. It should give all the lines in between 114456723 and 114459234, including these as well. Any... (2 Replies)
Discussion started by: gurpreet470
2 Replies
Login or Register to Ask a Question