迭代以下 awk 命令的最佳方法

迭代以下 awk 命令的最佳方法

我有以下 awk 语句

awk '/^string$/{i=1;next} i && i++ <= 2' file

这将搜索字符串,然后打印 2 行。

举个例子

$ cat file
string
aaa
bbb
ccc

$ awk '/^string$/{i=1;next} i && i++ <= 2' file
$ bbb

我想做的是将 2 改为计数器,这样我每次就可以向下迭代 10 行。例如

for i in {1..5}
do
   awk '/^111$/{i=1;next} i && i++ <= $i' file
done

这当然是行不通的,我不确定这是否可能,因为命令被封装在循环中。

作为参考,我想要做的是在配置文件(file.cfg)中检查值 [header] 并查看变量是否已启用(变量 = 已启用)

例如

cat file.cfg
[header]
# nothing
variable = enabled

我猜关键属性是 [header] 将位于未确定的行上(可能是第 1 行,也可能是第 122 行)

并且变量并不总是位于 [header] 之后的第二行,有些人可能会将其放在 7 个位置,其他人可能放在 2 个位置。

希望这是有道理的,并提前致谢。

答案1

[header]如果您的配置文件是使用行后接行构建的,variable=value您可以使用以下命令获取特定部分的所有值:

sed -n '/^\[header\]/,/^\[/p' /path/to/file.cfg|grep -vE '?\s?[;#]'

该部分将过滤从字符开始到(并包括)下一行的sed所有行。该命令将过滤掉以或作为起始字符的行。[header][grep;#

您可以使用 来代替 sed awk。基于之前对问题的回答https://stackoverflow.com/questions/17988756/how-to-select-lines- Between-two-marker-patterns-which-may-occurr-multiple-times-w:

awk '/\[header\]/{print; flag=1; next}/\[/{flag=0}flag' file.cfg

grep如果你想过滤掉注释行,你可以附加上面的命令。

答案2

在 shell 中,如果字符串并置且中间没有空格,则可以连接字符串,例如:

echo 'abc$def'"and so on"
abc$defand so on

因此,在您的示例中,只需退出 (') 字符串并启动 (") 字符串,以便 $ishell 可以对您的字符串进行插值:

awk '/^111$/{i=1;next} i && i++ <= '"$i" file

另外,如果您的[header]字符串很容易与数据行区分开,则可以使用 awk 的功能在两行之间运行命令。例如:

seq 10 | awk '/6/,/9/{print}'

将打印第 6 行到第 9 行。因此,您可以使用类似的内容,而不是自己计数并假设[header1]是典型的标头语法(因此您需要转义)[

awk '/^\[header1]/,/^\[header2]/ { print }'

相关内容