如何组合多个grep命令?

Jat*_*tin 4 linux grep

我有一个很长的.txt文件(LONG.txt).在那个txt文件中,我想搜索3种类型的模式,然后我想将grep结果捕获到一个新的txt文件(SHORT.txt)中.

模式:

  1. AAAAA

  2. BBBBB

  3. CCCCC

注意:

当找到图案AAAAA或时BBBBB,我想只打印包含AAAAA或的那一行BBBBB.

CCCCC找到模式时,我想打印包含CCCCC+下一行的那一行.

例:

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
Run Code Online (Sandbox Code Playgroud)

输出应该是:

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
Run Code Online (Sandbox Code Playgroud)

我尝试的是:

grep -B0 "AAAAA" LONG.txt > SHORT.txt
grep -B0 "BBBBB" LONG.txt > SHORT.txt
grep -B1 "CCCCC" LONG.txt > SHORT.txt
Run Code Online (Sandbox Code Playgroud)

但这并没有给我想要的输出.

nja*_*ski 5

由于您使用了单个箭头,您的代码将继续覆盖该文件。

第一次使用单箭头,随后使用双箭头附加到文件。

grep "AAAAA" LONG.txt > SHORT.txt
grep "BBBBB" LONG.txt >> SHORT.txt
grep -A1 "CCCCC" LONG.txt >> SHORT.txt
Run Code Online (Sandbox Code Playgroud)

前两个grep命令仅打印匹配的行,最后一个命令打印该行及其后一行。


的附加说明grep

默认情况下它只返回匹配的行。如果您传递-A带有数字的标志,它将显示匹配的行以及后面的行数。例如,-A1根据您的要求打印匹配行和下一行。类似地,该-B标志在匹配之前打印行。

记住:-A=之后,-B=之前。


更新

还有一个附加要求,即输出保留它们在原始文件中出现的顺序。

这是一个执行此操作的脚本:

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
Run Code Online (Sandbox Code Playgroud)

这里唯一的主要区别是我使用-n中的标志来grep打印行号,然后用sort这些行号对文件进行排序。行号仍会出现在该输出文件中,因此您可能需要删除它们。


gud*_*dok 5

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