首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果grep不支持-B选项,我如何在匹配之前查找行?

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

Stack Overflow用户
提问于 2014-06-05 18:52:49
回答 2查看 961关注 0票数 0

我需要在grep输出前查看5行。

我使用了命令,

代码语言:javascript
复制
grep -B 5 pattern filename

但是抛出了错误/usr/bin/grep: illegal option --B

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

EN

回答 2

Stack Overflow用户

发布于 2014-06-06 06:39:19

您是否考虑过使用awk

如果这是一个可行的选项,请选中下面这一行:

代码语言:javascript
复制
$ 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

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

x指定行数

我希望这能帮到你。

票数 0
EN

Stack Overflow用户

发布于 2014-06-06 13:58:00

Simply_Me的答案是正确的,但在每次不匹配时都会复制前面的所有行。(nit挑剔的技术性:即使gawk的实现避免了复制字符串本身,它仍然必须重新散列索引)。所以,仍然坚持使用awk:

代码语言:javascript
复制
#!/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代表当前行。如果有匹配项,我们将打印之前存储在pLines数组中的N行。您可能希望打印图案本身,但我没有。不管看到的是什么模式,我们都使用%运算符将刚刚处理过的行存储在pLines中,因此我们不必移位数组。

代码语言:javascript
复制
zoo0
blah1
foo2
bar3
hehe4
lisp5
foo5
blah6
foo7
bar8
hehe9
foo5

这是打印

代码语言:javascript
复制
blah1
foo2
bar3
hehe4
lisp5
foo5
blah6
foo7
bar8
hehe9

这是不包括模式的前5行。

它还可以在

代码语言:javascript
复制
hehe4
lisp5
foo5
blah6
foo7
bar8
hehe9
foo5

其中在第一次匹配foo5之前没有5行。在本例中,它打印空行。您可能需要为您的需求量身定做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24058278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档