Bash 用于计算跨多个文件的两个字符串之间的行数的脚本
我有一些数千行大小的文件。我的任务是计算每个文件中两个字符串之间的所有行——“访问列表$f-datacenter”和“ip访问列表”$f是一个变量,我将把它放进去。这些图案看起来像这样-Bash 用于计算跨多个文件的两个字符串之间的行数的脚本,bash,awk,scripting,Bash,Awk,Scripting,我有一些数千行大小的文件。我的任务是计算每个文件中两个字符串之间的所有行——“访问列表$f-datacenter”和“ip访问列表”$f是一个变量,我将把它放进去。这些图案看起来像这样- Beginning of file . . . . access-list $f-datacenter . . . ip access-list . . END OF FILE 我正在编写一个脚本,它将计算多个文件中这两个字符串之间的行数。我的脚本在字符串#中输入一个变量,并从我定义的数组中输入文件名- fn
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左右的内容
当我像这样单独运行相同的命令时,我得到了正确的行-
所以,问题是为什么脚本中会出现这种情况,以及如何修复它?将shell变量放入脚本中可能有几种方法 这是最好的方法。它使用
-v
选项:(请在-v
之后使用空格,否则它的便携性会降低。例如,awk-v var=
而不是awk-vvar
)
它们在每个文件中都有这一对的多个实例,还是只有一个?保证是成对的——如果一行存在,另一行也将存在?快速提问。你为什么使用:b&&$0~endpattern$0和endpattern很清楚,但为什么是b?@JFS31:我想确保变量
b
已设置,例如未找到开始模式,找到结束模式,然后它将打印当前记录编号-1,所以b&&$0~ end_模式
我明白了。这很聪明。谢谢你的回答:)
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
#!/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