如何组合多个grep命令?

时间:2016-01-15 09:30:14

标签: linux grep

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

模式:

  1. AAAAA

  2. BBBBB

  3. CCCCC

  4. 注意

    找到模式AAAAABBBBB后,我只想打印包含AAAAABBBBB的那一行。

    找到模式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
    

    但这并没有给我所需的输出。

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

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

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 =之前。

更新

还有一项要求是输出保留它们在原始文件中出现的顺序。

这是一个脚本:

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按这些行号对文件进行排序。行号仍将出现在此输出文件中,因此您可能希望删除这些行。

答案 2 :(得分:1)

您可以使用sed

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

解释

  • /AAAAA\|BBB/搜索AAAAA或BBBBB p打印当前行(=模式缓冲区)
  • /CCCCC/搜索CCCCC和 N将下一行读入缓冲区 p打印当前缓冲区