我有以下 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
因此,在您的示例中,只需退出 (') 字符串并启动 (") 字符串,以便
$i
shell 可以对您的字符串进行插值:
awk '/^111$/{i=1;next} i && i++ <= '"$i" file
另外,如果您的[header]
字符串很容易与数据行区分开,则可以使用 awk 的功能在两行之间运行命令。例如:
seq 10 | awk '/6/,/9/{print}'
将打印第 6 行到第 9 行。因此,您可以使用类似的内容,而不是自己计数并假设[header1]
是典型的标头语法(因此您需要转义)[
awk '/^\[header1]/,/^\[header2]/ { print }'