如果文本与标准

时间:2018-04-05 03:38:33

标签: linux awk sed grep

如果块内的文本包含CRITERIA,我想在PATTERN1和PATTERN2之间选择块,否则丢弃整个块。

示例任务: 选择PATTERN1 ='开始'之间的文字。和PATTERN2 ='结束',如果'之间的某些文字开始'并且'结束'匹配CRITERIA =' DCE',然后在' start'之间输出整个块。并且'结束'。

示例输入:

start
123
ABC
123
end
start
123
DCE
123
end
start
123
EFG
123
end

示例输出:

start
123
DCE
123
end

我使用awk尝试了以下操作,但无法找到如何在两种模式之间使用CRITERIA:

awk '/start/,/end/' input_file

2 个答案:

答案 0 :(得分:2)

由于起始块由空的rexords分隔,因此您可以使用它们进行分隔。这里有awk:

$ awk 'BEGIN{RS=""}/DCE/' file
start
123
DCE
123
end

修改:由于空记录根本不在那里,让我们与end分开:

$ awk 'BEGIN{RS=ORS="end\n"}/DCE/' file
start
123
DCE
123
end

答案 1 :(得分:2)

编辑: 根据OP,Input_file也可能在末尾匹配,并且可能没有结束字符串,因此现在也按照这样添加代码。

awk '
/start/{
  if(val)               {   print value   };
  flag=1;
  value=val=""}
/[dD[cC][eE]/ && flag   {   val=1         }
/end/                   {   flag=""       }
flag{
  value=value?value ORS $0:$0
}
END{
  if(val)               {   print value   }}
'  Input_file

<强> 说明:

awk '
/start/{                                     ##Looking for string start in a line if found then do following.
  if(val)               {   print value   }; ##Checking if variable val is NOT NULL, if yes then print variable of value.
  flag=1;                                    ##Setting variable named flag as 1 here.
  value=val=""}                              ##Nullifying variables value and val here.
/[dD[cC][eE]/ && flag   {   val=1         }  ##Searching string DCE/dce in a line and checking if variable flag is NOT NULL then set variable val as 1.
/end/                   {   flag=""       }  ##Searching string end in current line, if found then Nullifying flag here.
flag{                                        ##Checking if variable named flag is SET or NOT NULL here.
  value=value?value ORS $0:$0                ##Creating value whose value is current line value and concatenating in its own value.
}
END{                                         ##Starting END block of awk here.
  if(val)               {   print value   }} ##Checking if variable val is NOT NULL then print variable value here.
'  Input_file

您能否请关注awk并告诉我这是否对您有所帮助。

awk '/start/{if(val){print value};flag=1;value=val=""} /[dD[cC][eE]/ && flag{val=1} /end/{flag=""} {value=value?value ORS $0:$0}' Input_file

此处也添加非单线形式的解决方案。

awk '
/start/{
  if(val)            { print value  };
  flag=1;
  value=val=""}
/[dD[cC][eE]/ && flag{  val=1       }
/end/                {  flag=""     }
{
  value=value?value ORS $0:$0
}
'   Input_file