我正在尝试使用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
----
我尝试了其他排列,但都给了我不同的错误。
答案 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
----
编辑:这是从我的个人存档中获取的:)
独家
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
----