grep
仅返回与正则表达式匹配的行,通常我真正想要看到的是匹配行上方和下方的几行(例如 2 行)。有没有简单的方法可以实现呢?
编辑:操作系统:基于 Ubuntu 的 Bodhi Linux。正如评论中提到的, -C 在普通版本中不起作用,但在我的例子中它是 GNU grep 。
答案1
从man grep
:
上下文线控制
-A NUM,--after-context=NUM
在匹配行之后打印 NUM 行尾随上下文。在连续的匹配组之间放置一条包含组分隔符 (--) 的行。使用 -o 或 --only-matching 选项,这不起作用并给出警告。
-B NUM, --before-context=NUM
在匹配行之前打印 NUM 行前导上下文。在连续的匹配组之间放置一条包含组分隔符 (--) 的行。使用 -o 或 --only-matching 选项,这不起作用并给出警告。
-C NUM,-NUM,--context=NUM
打印 NUM 行输出上下文。在连续的匹配组之间放置一条包含组分隔符 (--) 的行。使用 -o 或 --only-matching 选项,这不起作用并给出警告。
看看那是多么容易吗? man
是你的朋友。
答案2
使用awk(更便携):
awk '
{
arr[NR]=$0
}
END{
for (i=0;i<=NR;i++) {
if (arr[i] ~ grep){
for (j=i-count; j<=i+count; j++) {
print arr[j]
}
}
}
}
' grep=kdm count=4 /etc/passwd
我在比赛之前/之后用 4 行grep user kdm
againstts/etc/passwd
在一个嘘脚本 :
#!/bin/sh
awk '
{
arr[NR]=$0
}
END{
for (i=0;i<=NR;i++) {
if (arr[i] ~ grep){
for (j=i-count; j<=i+count; j++) {
print arr[j]
}
}
}
}
' grep="$1" count="$2" "$3"
用法 :
./contextgrep <pattern> <count> <file>