我有一个如下所示的文件:
line1
line2
line3
line4
line5
line6
line7
line5
line2
我想获取line1
和之间的数据line5
。我用了awk '/line1/,/line5/' myfile
。预计输出将是:
line1
line2
line3
line4
line5
但 awk 会读取直到最后一个匹配line5
。我希望 awk 在第一场比赛中停止,而不是在最后一场比赛中停止。
答案1
我无法重现你的问题。 awk *做了我期望的事情:打印第一次出现 之间的每一行,line1
直到第一次出现line5
:
$ awk '/line1/,/line5/' file
line1
line2
line3
line4
line5
line5
文件第五行的字符串中是否有隐藏的非打印字符?这可以解释为什么awk
不匹配它。
您可以通过运行等效命令来仔细检查sed
:
$ sed -n '/line1/,/line5/p' file
line1
line2
line3
line4
line5
指示不打印每一行(其默认行为),同时指示打印从 的第一个匹配项到 的第一个匹配项之间-n
的每一行。sed
/line1/,/line5/p
line1
line5
如果您只想打印第一的以匹配模式的行开头line1
并以匹配 的行结尾的一组行line5
,您可以使用:
sed -n '/line1/,$p;/line5/q' file
*我使用 进行了检查gawk
,GNU 实现awk
(Kusalananda 已确认在 OpenBSD 上awk
也mawk
做了正确的事情)。
答案2
您可以使用以下awk
:
awk '/line1/{prnt=1} prnt{print} /line5/{exit}' infile
这将打印与 匹配的行,line1
直到下一个第一行与 匹配,line5
然后立即退出。
答案3
awk '/foo/,/bar/'
印刷全部文件中以匹配的行开头foo
并以匹配的下一行(甚至是与等效行相反的同一行sed
)结束的部分bar
(请注意,正则表达式也匹配包含includeline1
的行)。line1anything
line10
如果你想匹配第一的以匹配的行开始line1
并以匹配的下一行(或同一行)结束的部分line5
,您可以执行以下操作:
sed '/line1/,$!d;/line5/q' < file
line5
(请注意,如果在第一个匹配的行之后没有匹配的行line1
,它将从该line1
行打印到文件末尾。另请注意,sed
模式是基本的正则表达式,而awk
那些是扩展表达式)。