Grep文本的特定部分

时间:2014-04-22 14:26:04

标签: linux bash shell

我有这样的文字:

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 -A2grep -A3

3 个答案:

答案 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