我有这样的文字:
ora.sas.aa.svc
1 ONLINE ONLINE sas1
ora.sas.bb.svc
1 ONLINE ONLINE sas2
ora.sas.cc.svc
1 ONLINE ONLINE sas2
ora.sas.dd.svc
1 ONLINE ONLINE sas1
ora.sas.ee.svc
1 ONLINE ONLINE sas1
2 ONLINE ONLINE sas2
我想要的是grep这个.svc
的特定部分和在线状态,如:
example.txt |grep aa
ora.sas.aa.svc
1 ONLINE ONLINE sas1
或
example.txt |grep ee
ora.sas.ee.svc
1 ONLINE ONLINE sas1
2 ONLINE ONLINE sas2
"在线"的行号可能会改变,所以我无法使用grep -A2
或grep -A3
。
答案 0 :(得分:2)
不确定你是否可以用grep来做,但你绝对可以用awk来做。
<example.txt awk 'NF==1 { got_match = ($0 ~ /PATTERN/)} got_match {print}'
用“ee”或“aa”替换PATTERN,它应该可以解决问题。
答案 1 :(得分:2)
您可以改用awk:
awk -v s='ee' 'NF==1 && $0 ~ s{p=1} NF==1 && !($0 ~ s){p=0} p' file
ora.sas.ee.svc
1 ONLINE ONLINE sas1
2 ONLINE ONLINE sas2
awk -v s='aa' 'NF==1 && $0 ~ s{p=1} NF==1 && !($0 ~ s){p=0} p' file
ora.sas.aa.svc
1 ONLINE ONLINE sas1
答案 2 :(得分:1)
使用sed
:
$ func() {
> sed -n "/$1/{:a;p;n;/^[[:space:]]/ba}" "$2"
> }
$ func aa example.txt
ora.sas.aa.svc
1 ONLINE ONLINE sas1
$ func ee example.txt
ora.sas.ee.svc
1 ONLINE ONLINE sas1
2 ONLINE ONLINE sas2