[英]How to combine multiple grep commands?
我有一个很长的.txt文件( LONG.txt
)。 在那个txt文件中,我想搜索3种类型的模式,然后我想将grep结果捕获到一个新的txt文件( SHORT.txt
)中。
模式:
AAAAA
BBBBB
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
输出应该是:
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
我尝试的是:
grep -B0 "AAAAA" LONG.txt > SHORT.txt
grep -B0 "BBBBB" LONG.txt > SHORT.txt
grep -B1 "CCCCC" LONG.txt > SHORT.txt
但这并没有给我想要的输出。
awk '/AAA|BBB|CCC/ {print; if ($0 ~ /CCC/) {getline; print;} }'
您的代码将继续覆盖该文件,因为您使用了单个箭头。
首次使用单箭头,随后使用双箭头追加到文件中。
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
=之前。
UPDATE
还有一项要求是输出保留它们在原始文件中出现的顺序。
这是一个脚本:
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
这里唯一的主要区别是我在grep
使用-n
标志来打印行号,然后我使用sort
来按这些行号对文件进行排序。 行号仍将出现在此输出文件中,因此您可能希望删除它们。
你可以使用sed
:
sed -n '/AAAAA\|BBBBB/p;/CCCCC/{N;p}' LONG.txt > SHORT.txt
说明
/AAAAA\\|BBB/
搜索AAAAA或BBBBB p
打印当前行(=模式缓冲区) /CCCCC/
搜索CCCCC和N
读取下一行进入缓冲区p
打印当前缓冲区
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.