簡體   English   中英

僅當模式 2 macthes 時,awk/sed 命令才打印模式 1

[英]Awk/sed command to print pattern1 only if patterm 2 macthes

僅當“日志”行后面的文本中存在“ref1”時才嘗試打印“日志”行

示例文本:

Log 0102
............
.....ref1.......
......ref1....
Log 0103
............
.....ref1.......
....
Log 0104
............
.....ref2.......
......

預期結果:

Log 0102
Log 0103

結果我得到:

Log 0102
Log 0102
Log 0103

我試過這個 awk 命令但沒有得到結果:

awk '/Log*/ line =$0}/ref1/{print line}'

對於您展示的樣品,請嘗試遵循awk代碼。

awk '
/^Log/{
  if(found){ print value }
  value=$0
  found=""
  next
}
/ref1/{
  found=1
}
END{
  if(found){
     print value
  }
}
' Input_file

上述代碼的單行形式。

awk awk '/^Log/{if(found){print value};value=$0;found="";next} /ref1/{found=1} END{if(found){print value}}' Input_file

使用gnu-awk使用自定義RS相當簡單:

awk -v RS='(^|\n)Log ' '/ref1/ {printf "Log %s\n", $1}' file

Log 0102
Log 0103

這里-v RS='(^|\n)Log 'RS設置為Log后跟一個空格。 Log前面應該有 start position 或換行符。

 mawk 'gsub("^|Log [^\n]+|"FS,"\1&\2",$,(NF-=+_<NF)) + \ gsub("\2[^\1\2]*\1","\n") + \ gsub("^[\1\2]+|[\1\2]\n[^\1\2]+$",_)^_' RS= FS='ref1'
Log 0102
Log 0103

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM