搜索字符串的组合和模式

时间:2017-07-27 08:52:16

标签: linux bash awk sed grep

需要帮助bash脚本的一部分,它需要找到一个特定的模式字符串。下面给出了一个示例字符串:

Lazy<T>
  • 我需要在IF和ENDIF条件下找到ODATE,ABC,RESTART的组合
  • 我特别需要在IF和ENDIF之间进行检查。此外,它应该检查IF和ENDIF之间存在三个参数ODATE,ABC和RESTART的条件。如果条件满足,则应打印出来。
  • 我尝试了以下命令
  

cat file | sed -n'/ %% IF /,/ %% ENDIF / p'

//*-----------
//* %%SET %%ABC     = %%BLANK
//* %%SET %%RESTART = %%BLANK7
//* %%SET %%DANGO= 236985
//*-----------
//* %%IF %%ODATE EQ 123456
//* %%SET %%ABC=   GSG34
//* %%SET %%RESTART = RESTART
//* %%ENDIF
//*-----------
//* %%IF %%ODATE EQ 463123
//* %%SET %%DANGO= 236985
//* %%ENDIF
//*-----------
//* %%IF %%ODATE EQ 15641
//* %%SET %%RESTART = %%BLANK7
//* %%ENDIF
//*-----------

我只需要找到以下内容:

//* %%IF %%ODATE EQ 123456
//* %%SET %%ABC=   GSG34
//* %%SET %%RESTART = RESTART
//* %%ENDIF
//* %%IF %%ODATE EQ 463123
//* %%SET %%DANGO  = 236985
//* %%ENDIF
//* %%IF %%ODATE EQ 15641
//* %%SET %%RESTART = %%BLANK7
//* %%ENDIF

我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

您可以使用以下awk命令:

awk '/%%ODATE EQ 123456/{p=1}/ENDIF/&&p{p=0;print}p' file

输出:

//* %%IF %%ODATE EQ 123456
//* %%SET %%ABC=   GSG34
//* %%SET %%RESTART = RESTART
//* %%ENDIF

当变量awk为真时,p基本上会在此处打印一行。当行 ODATE EQ 123456 出现时,p将设置为,并在下一个 ENDIF 上重置。 ENDIF 本身也会打印出来。

按照下面的评论,您可以使用此命令:

awk '/IF/&&/ABC/&&/RESTART/' RS='\n//\\*---+\n' 

此处的关键是记录分隔符 RS

答案 1 :(得分:0)

使用sed:

sed -n '/%%IF /{:a;N;/%%ENDIF/!ba;/ODATE/{/ABC/{/RESTART/p;}}}' file