我有一些数千行的文件。我的任务是计算两个字符串之间的所有行 - 每个文件中的“access-list $ f-datacenter”和“ip access-list”。 $ f是我将要输入的变量。模式看起来像这样 -
Beginning of file
.
.
.
.
access-list $f-datacenter
.
.
.
ip access-list
.
.
END OF FILE
我正在编写一个脚本,它将计算多个文件中这两个字符串之间的行数。我的脚本输入字符串#中的变量和我定义的数组中的文件名 -
fnames=( x y ); for f in ${fnames[@]}; do awk '/access-list $f-datacenter/ {b=NR; next} /ip access-list/ {print NR-b-1; exit}' $f-datacenter.txt ; done
但是,我看到这个脚本每次运行都会返回错误的行号。例如,如果实际行号在600范围内,则脚本只会显示200左右的内容。
当我像这样单独运行相同的命令时,我得到正确的行#s -
awk '/access-list x-datacenter/ {b=NR; next} /ip access-list/ {print NR-b-1; exit}' $x-datacenter.txt
awk '/access-list y-datacenter/ {b=NR; next} /ip access-list/ {print NR-b-1; exit}' $y-datacenter.txt
所以,问题是为什么这会在脚本中失败以及如何修复它?
答案 0 :(得分:0)
将shell变量放入awk可以通过多种方式完成。
这是最好的方法。它使用-v
选项:( P.S。在-v
之后使用空格,或者它的可移植性较差。例如,awk -v var=
不是awk -vvar
)
#!/usr/bin/env bash
fnames=( x y );
for f in ${fnames[@]}; do
awk -v name="$f" 'BEGIN{
start_pattern = "access-list " name "-datacenter"
end_pattern = "ip access-list"
}
$0 ~ start_pattern{ b=NR }
b && $0 ~ end_pattern { print NR-b-1; exit}
' "$f-datacenter.txt"
done