如何 grep 某个文本并显示其行和后面的行

如何 grep 某个文本并显示其行和后面的行

我有一个类似于以下内容的文件:

abcdef
123
ghiflk
234
sfhskdhf
483

我想搜索一个字符串,输出也应该包括下一行(和/或上一行)。

例如:

grep "bcd" myfile

Output:
abcdef
123

或者显示上一行:

grep "ifl" myfile

Output:
123
ghiflk

我尝试了几天在网上寻找解决方案,但似乎无法弄清楚。

答案1

GNU 和 BSDgrep实用程序具有-A匹配后行的选项和-B匹配前行的选项。因此,您可以执行以下操作:

$ grep -A 1 bcd myfile
abcdef
123

比赛结束后显示该行并

$ grep -B 1 ifl myfile
123
ghiflk

显示匹配项之前的行。最后,您可以使用-C显示比赛前后的 N 行:

$ grep -C 1 ifl myfile
123
ghiflk
234

如果您的版本grep不支持此功能,您可以随时尝试其他方法:

  • 使用 POSIXgrepsed选项以及 shell:

    n=$(grep -n bcd foo | cut -d':' -f1); sed -n "${n},$((n + 1))p" myfile
    
  • 使用 AWK

    awk '/bcd/ {print; getline; print}' myfile
    

还有很多很多。

答案2

除了 Steven D 提到的选项之外,GNU grep 还接受 -n 选项的(未记录的)参数,该参数指定在匹配行之前和之后打印的行数。当然,使用 -n 会打开行号,因此如果您不需要行号,则 -A 和 -B 选项更好。

例如,grep -n1 pattern行为就像grep -n -A1 -B1 pattern


正如 don_crissti 在评论中提到的,这不是实际上是该选项的未记录参数-n-NUM(其中NUM是一个整数)实际上是选项的同义词-C NUM,因此-nNUM实际上是 的缩写-n -C NUM

相关内容