在这个玩具输入上考虑以下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
有吗?
由于
答案 0 :(得分:2)
不,你不能用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
按摩以适应...