我有一个类似于以下内容的文件:
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
不支持此功能,您可以随时尝试其他方法:
使用 POSIX
grep
和sed
选项以及 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
。