2014-04-22 2 views
1

У меня есть текст, как это:Grep определенная часть текста

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 с grep -A2 или grep -A3.

ответ

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

Не уверен, что вы можете сделать это с помощью grep, но вы можете определенно сделать это с awk.

<example.txt awk 'NF==1 { got_match = ($0 ~ /PATTERN/)} got_match {print}' 

Замените PATTERN на «ee» или «aa», и он должен сделать трюк.

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 
Смежные вопросы