如何运行 grep 并显示匹配前后的 x 行数

如何运行 grep 并显示匹配前后的 x 行数

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 '
    {
        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 kdmagainstts/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> 

相关内容