打印第 7-13 行之间包含某个字符串的内容(awk 脚本)

打印第 7-13 行之间包含某个字符串的内容(awk 脚本)

我正在尝试编写一个脚本(.awk),它将打印出第 7-13 行之间包含特定字符串的行。我已经部分工作了,但是它打印出包含该字符串的所有行,而不仅仅是 7-13 之间的行。

#!/usr/bin/awk -f
BEGIN { (NR>=7) && (NR<=13) }
/word/ {print $0}

运行时的输出

script.awk filename

是包含该单词的所有行

编辑:

在尝试了杰夫的建议后,我得到了他的建议。 /needle/ 是关键字。

代码 代码 解决了!

问题是我在另一行有 {print $0} ,习惯了在其他语言中我喜欢将代码分开

答案1

您已将行限制逻辑放在“BEGIN”块中,该块将被执行 awk读入任何数据。将该逻辑移至主循环:

NR >= 7 && NR <= 13 && /word/ { print }

$0是默认print参数,如果没有给出...或者,甚至更短

NR >= 7 && NR <= 13 && /word/

如果没有指定的话, since{print}是默认操作。脚本
的主体awk采用“模式”“动作”的形式;您希望该模式为您想要的操作添加前缀。在这里,该模式要求三个测试都为真,并且操作是打印该行。将 放在print单独的行上意味着“通过”测试时没有“操作”,并且没有用于打印每一行的“模式” - 导致每一行都被打印。

答案2

只是补充杰夫的回答其中一个写在sed

sed -n '7,13 { /expression/ p; }' <file

这将打印第 7 行和第 13 行(含)之间与正则表达式匹配的每一行expression。默认输出被关闭,-n因此只有使用命令显式打印的行p才会被输出。

将上述脚本直接翻译sedawk

awk 'NR == 7, NR == 13 { if (/expression/) print }' <file

该条件NR == 7, NR == 13应理解为“从任意为NR7 的输入记录,到任意为 13 的输入记录NR”,其中“输入记录”默认为一行,NR是迄今为止读取的记录(行)数。

答案3

怎么样

awk 'NR>6&&NR<14&&/word/' file

相关内容