awk查找范围之间的线

时间:2019-06-21 19:41:42

标签: unix awk

我正在尝试使用awk获取两个单词之间的所有行。我的第一个单词是目录,第二个单词是四个负字符的序列,如下所示:----

这是我尝试过的:

awk '/\/ua\/Debug\/xeGenReport\/src\//,/----/ errorLog2

样本输入:

/ua/Debug/xeGenReport/src/
++++
16955:../main2.C:492:22: error: something
16959:../main2.C:577:21: error: something
16963:../report2.C:2630:22: error: something
----
/ua/Debug/xeGenReport/src/ // I don't want this line in the final output
----
More text here I don't want

所需的输出:

/ua/Debug/xeGenReport/src/
++++
16955:../main2.C:492:22: error: something
16959:../main2.C:577:21: error: something
16963:../report2.C:2630:22: error: something
----

我尝试了其他排列,但都给了我不同的错误。

2 个答案:

答案 0 :(得分:2)

您需要转义/

类似这样(不包括开始/停止):

awk '/----/{f=0} f; /\/ua\/Debug\/xeGenReport\/src/{f=1}' file
++++
16955:../main2.C:492:22: error: something
16959:../main2.C:577:21: error: something
16963:../report2.C:2630:22: error: something

或者这样(包括开始/停止):(使用exit不会获得超出所需的数量)

awk '/\/ua\/Debug\/xeGenReport\/src/{f=1} f; /----/{exit}' file
/ua/Debug/xeGenReport/src/
++++
16955:../main2.C:492:22: error: something
16959:../main2.C:577:21: error: something
16963:../report2.C:2630:22: error: something
----

编辑:这是从我的个人存档中获取的:)

*在“ START / END”之间打印文本(不包括在内)(将{f = 0}替换为{exit}以防止重复)

  

独家
  awk'/ START / {f = 1; next} / END / {f = 0} f'
  awk'/ END / {f = 0} f; / START / {f = 1}'#best
  包括
  awk'/ START / {f = 1} / END / {f = 0; print} f'
  awk'/ START / {f = 1} f; / END / {f = 0}'
  awk'/ START /,/ END /'
  sed -n'/ SRART /,/ END / p'
  请不要在START到END #inclusive之间进行打印
  awk'/ START / {f = 1; next}!f; / END / {f = 0}'
  awk'/ START /,/ END / {next} 1'
  sed'/ START /,/ END / d'

答案 1 :(得分:1)

有一个流派,应该避免使用范围模式,但是由于Jotne已经发布了标志样式,因此我将展示这种替代方法,该方法与您最初的尝试更加接近:

$ awk '/\/ua\/Debug\/xeGenReport\/src/,/----/ {print; if ($0 ~ /----/) exit}' file
/ua/Debug/xeGenReport/src/
++++
16955:../main2.C:492:22: error: something
16959:../main2.C:577:21: error: something
16963:../report2.C:2630:22: error: something
----