Bash 用于计算跨多个文件的两个字符串之间的行数的脚本

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

我有一些数千行大小的文件。我的任务是计算每个文件中两个字符串之间的所有行——“访问列表$f-datacenter”和“ip访问列表”$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左右的内容

当我像这样单独运行相同的命令时,我得到了正确的行-


所以,问题是为什么脚本中会出现这种情况,以及如何修复它?

将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