如果我的grep不支持-B选项,如何在匹配前找到行?

时间:2014-06-05 10:52:49

标签: unix grep

我需要在grep输出之前查看5行 我用了命令,

grep -B 5 pattern filename

但是因为错误/usr/bin/grep: illegal option --B

而被抛出

如何处理这种情况并在grep语句之前查看5行?

2 个答案:

答案 0 :(得分:0)

您是否考虑过使用awk

如果这是一个可行的选项,请检查这个,长,行:

$ awk '/PATTERN/{for(i=1;i<=x;)print a[i++];print}{for(i=1;i<x;i++)a[i]=a[i+1];a[x]=$0;}' x=5 file

上面的命令将返回匹配模式和匹配模式之前的五行(即总共6行,而grep -B 5返回总共五行,包括匹配的一行)。

x表示行数

我希望这会有所帮助。

答案 1 :(得分:0)

Simply_Me的答案是正确的,但复制了每个不匹配的所有前一行。 (挑选技术性:即使gawk的实现避免了复制字符串本身,它仍然需要重新散列索引)。所以,仍然坚持使用awk:

#!/usr/bin/awk -f

BEGIN { cl=1; }

/foo5/ {
    for (i=cl; i<cl+N; i++)
    print pLines[i % N];
    cl=1;
}

{  pLines[cl % N] = $0; cl = cl + 1; }

cl代表当前行。如果我们有匹配,我们打印N行,我们之前存储在pLines数组中。您可能希望打印模式本身,我没有。无论看到哪种模式,我们都会使用%运算符存储我们刚刚在pLines中处理的行,因此我们不必移动数组。

有关

zoo0
blah1
foo2
bar3
hehe4
lisp5
foo5
blah6
foo7
bar8
hehe9
foo5

打印

blah1
foo2
bar3
hehe4
lisp5
foo5
blah6
foo7
bar8
hehe9

这是前5行不包括模式。

它也适用于

hehe4
lisp5
foo5
blah6
foo7
bar8
hehe9
foo5

在foo5的第一场比赛之前没有5前一行。在这种情况下,它打印空行。您可能需要根据需要定制。