パターンAを一致させ、パターンBが一致した場合にのみ印刷します。次の行を含めてください。

パターンAを一致させ、パターンBが一致した場合にのみ印刷します。次の行を含めてください。

「search_string」という単語を含むすべての行+その後の行+「mod」と一致するその前の行を取得したいと思います。
私は試した:

grep -n 'mod\|search_string' ip | grep --before 1 search_string> inter  
grep -n --after 1 search_string ip >> inter  
sort -t':' -k1,1n -u inter -o op

もっと良い方法がありますか?

文書:

mod start1  
some lines  
mod start2  
other lines  
mod start3  
 many other lines  
 search_string yada yada  
 hello  
 many other lines  
 search_string yada yada  
 bye  
mod start4  
 search_string baba baba  
 this too  
mod start5  

予想出力:

mod start3  
 search_string yada yada   
 hello  
 search_string yada yada  
 bye  
mod start4  
 search_string baba baba  
 this too

ベストアンサー1

awk '
   $0 ~ /mod/ { md=$0 }
   $0 ~ /search_string/ { if(md!="") { print md }; md="" ; print; getline; print }
   '

説明する:

  • 含まれている行modmd
  • search_stringmd以前に保存された行、行自体、および次の行の印刷をトリガーする行が含まれます。
  • if(md!="")そしてmd=""(あなたの例では)単一の下に複数のmod-s がある場合、重複した行が表示されないことを確認してください。search_stringmodmod start3

メモ:

  • modとを含む行はsearch_stringこのロジックを破ります。

おすすめ記事