String 读取特定字符串的文件,并在匹配后读取行
我有一个文件,看起来像:String 读取特定字符串的文件,并在匹配后读取行,string,awk,String,Awk,我有一个文件,看起来像: AA 2 3 4 CCC 111 222 333 XXX 12 23 34 我正在寻找awk命令,从上面搜索字符串“CCC”,并打印在“CCC”之后出现的所有行,但在我到达“XXX”后立即停止读取 一个非常简单的命令为我执行读取操作,但不会在XXX处停止 awk '$0 == "CCC" {i=1;next};i && i++' c.out 你能试试下面的吗 awk '/CCC/{flag=1;next}
AA
2
3
4
CCC
111
222
333
XXX
12
23
34
我正在寻找awk命令,从上面搜索字符串“CCC”,并打印在“CCC”之后出现的所有行,但在我到达“XXX”后立即停止读取
一个非常简单的命令为我执行读取操作,但不会在XXX处停止
awk '$0 == "CCC" {i=1;next};i && i++' c.out
你能试试下面的吗
awk '/CCC/{flag=1;next} /XXX/{flag=""} flag' Input_file
解决方案1:使用sed
sed -n '/CCC/,/XXX/p' Input_file
第二种解决方案:使用awk
awk '/CCC/{flag=1} flag; /XXX/{flag=""}' Input_file
解决方案3:如果您想从字符串CCC
打印到XXX
而不是这些字符串,请执行以下操作
awk '/CCC/{flag=1;next} /XXX/{flag=""} flag' Input_file
你能试试下面的吗
awk '/CCC/{flag=1;next} /XXX/{flag=""} flag' Input_file
解决方案1:使用sed
sed -n '/CCC/,/XXX/p' Input_file
第二种解决方案:使用awk
awk '/CCC/{flag=1} flag; /XXX/{flag=""}' Input_file
解决方案3:如果您想从字符串CCC
打印到XXX
而不是这些字符串,请执行以下操作
awk '/CCC/{flag=1;next} /XXX/{flag=""} flag' Input_file
“在这和那之间做点什么”可以通过以下方法轻松解决:
但这并不完全是你所要求的。您想在CCC
之后打印所有内容,并在XXX
上退出(停止阅读)。这意味着
awk '/XXX/{exit};f;/CCC/{f=1}'
“在这和那之间做点什么”可以通过以下方法轻松解决:
但这并不完全是你所要求的。您想在CCC
之后打印所有内容,并在XXX
上退出(停止阅读)。这意味着
awk '/XXX/{exit};f;/CCC/{f=1}'
永远不要使用“普通awk风格的解决方案”。始终使用旗帜。当你使用一个范围表达式时,它需要一个完全重写或重复的条件,只要你的需求有最小的变化(例如,不打印范围的结尾,现在就是这样)。@EdMorton好的,我将重新措辞:-)但是当需求在这方面发生变化时,你所做的一切都是“重写”一个不需要动脑筋的事情。(反正我大多数时候只使用一次awk模式)。人们真正要做的是将其重写为
/CCC/,/XXX/{if(!/XXX/)print}
,因为他们希望在现有的基础上进行构建,而不是将其废弃,并以正确的方式编写,只列出一次标志和每个条件。然后,他们有了另一个需求变化,并再次增加了混乱。我看过太多次了。如果你只是不使用范围表达式,那么你就永远不会落入这个陷阱。@EdMorton关于NR==2,NR==4的情况呢?我不会这么做。我会做NR==2{f=1}f;NR==4{exit}'
。除了我之前所说的,对于任何大小的输入文件,如果效率很重要,那么这将比NR==2,NR==4更有效。永远不应该使用“普通awk风格的解决方案”。始终使用旗帜。当你使用一个范围表达式时,它需要一个完全重写或重复的条件,只要你的需求有最小的变化(例如,不打印范围的结尾,现在就是这样)。@EdMorton好的,我将重新措辞:-)但是当需求在这方面发生变化时,你所做的一切都是“重写”一个不需要动脑筋的事情。(反正我大多数时候只使用一次awk模式)。人们真正要做的是将其重写为/CCC/,/XXX/{if(!/XXX/)print}
,因为他们希望在现有的基础上进行构建,而不是将其废弃,并以正确的方式编写,只列出一次标志和每个条件。然后,他们有了另一个需求变化,并再次增加了混乱。我看过太多次了。如果你只是不使用范围表达式,那么你就永远不会落入这个陷阱。@EdMorton关于NR==2,NR==4的情况呢?我不会这么做。我会做NR==2{f=1}f;NR==4{exit}'
。除了我之前所说的,对于任何大小的输入文件来说,效率都比NR==2,NR==4
有效得多。我本以为flag=0
会对应于flag=1
,所以我很好奇为什么flag=”“
会突然将一个整数变成一个字符串呢,如果脚本应该停止读取,则肯定flag=0;退出
?我本以为flag=0
会与flag=1
相对应,所以我很好奇为什么flag=”“
会突然将一个整数变成一个字符串?而且,如果脚本应该停止读取,那么肯定flag=0;退出
?