微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – 使用-C(或-B / -A)运行grep结果时输出空行

在这个玩具输入上考虑以下grep命令:

user@user:~$echo -e "a\nb\nc\nd\ne" | egrep "(b|d)" -C 1 -n
1-a
2:b
3-c
4:d
5-e

虽然这已经很好了,但我想知道是否有某种技巧可以在不同结果之间找到一条空行.类似于:

user@user:~$echo -e "a\nb\nc\nd\ne" | egrep "(b|d)" -C 1 -n
1-a
2:b
3-c

3-c
4:d
5-e

在那儿?

谢谢

解决方法:

不,你不能用grep这样做.你可以用awk做到这一点:

$echo -e "a\nb\nc\nd\ne" | awk -v c=1 '{a[NR]=$0} /(b|d)/{hits[NR]} END{ for (hit in hits) { if (x++) print "---"; for (i=hit-c;i<=hit+c;i++) print i (i==hit?":":"-") a[i] } }'
1-a
2:b
3-c
---
3-c
4:d
5-e

很明显,每次你想要这样做都有点长,但你可以在shell脚本中使用它,例如:

$cat markRanges
awk -v c="$1" -v re="$2" '
{ a[NR]=$0 }
$0 ~ re { hits[NR] }
END {
    for (hit in hits) {
        if (x++) {
            print "---"
        }
        for (i=hit-c; i<=hit+c; i++) {
            print i (i==hit?":":"-") a[i]
        }
    }
}
'

$echo -e "a\nb\nc\nd\ne" | ./markRanges 1 '(b|d)'
1-a
2:b
3-c
---
3-c
4:d
5-e

按摩适合……

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐