How to combine multiple grep commands?

I have a long .txt file ( LONG.txt). In this txt file I want to find 3 types of templates, and then I want to write the result of grep to a new txt file ( SHORT.txt).

Patterns:

  • AAAAA

  • BBBBB

  • CCCCC

NOTE :

When the pattern is found AAAAAor BBBBB, I want to print only the line that contains AAAAAor BBBBB.

When the pattern is found CCCCC, I want to print this line containing CCCCC+ the next line 1.

Example:

LONG.txt:

bla bla 
bla bla 
bla bla 
something something AAAAA something something
bla bla 
bla bla 
something something CCCCC something something
bla bla 
bla bla 
bla bla 
bla bla 
bla bla 
bla bla 
something something BBBBB something something
bla bla 
bla bla 
bla bla 
something something AAAAA something something
bla bla 
something something AAAAA something something
bla bla 
something something BBBBB something something
bla bla 
bla bla 
bla bla 
something something CCCCC something something
bla bla
bla bla
bla bla

The conclusion should be:

something something AAAAA something something
something something CCCCC something something
bla bla 
something something BBBBB something something
something something AAAAA something something
something something AAAAA something something
something something BBBBB something something
something something CCCCC something something
bla bla

What I tried:

grep -B0 "AAAAA" LONG.txt > SHORT.txt
grep -B0 "BBBBB" LONG.txt > SHORT.txt
grep -B1 "CCCCC" LONG.txt > SHORT.txt

But this does not give me the desired result.

+4
source share
3 answers

awk '/AAA|BBB|CCC/ {print; if ($0 ~ /CCC/) {getline; print;} }'

+5
source

, .

.

grep "AAAAA" LONG.txt > SHORT.txt
grep "BBBBB" LONG.txt >> SHORT.txt
grep -A1 "CCCCC" LONG.txt >> SHORT.txt

grep , .


grep:

. -A , . . -A1 . , -B .

: -A= , -B= .


, , .

script:

grep -n "AAAAA" LONG.txt > SHORT.txt
grep -n "BBBBB" LONG.txt >> SHORT.txt
grep -n -A1 "CCCCC" LONG.txt >> SHORT.txt
sort -n -o SHORT.txt SHORT.txt

sed -i 's/^[0-9]\+//' SHORT.txt
sed -i 's/^.//g' SHORT.txt

, -n grep , sort . - , .

+4

sed:

sed -n '/AAAAA\|BBBBB/p;/CCCCC/{N;p}' LONG.txt > SHORT.txt

  • /AAAAA\|BBB/ AAAAA BBBBB p (= )
  • /CCCCC/ CCCCC N p
+1

Source: https://habr.com/ru/post/1624406/


All Articles