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

时间:2017-06-14 01:14:18

标签: bash awk scripting

我有一些数千行的文件。我的任务是计算两个字符串之间的所有行 - 每个文件中的“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

所以,问题是为什么这会在脚本中失败以及如何修复它?

1 个答案:

答案 0 :(得分:0)

将shell变量放入可以通过多种方式完成。

这是最好的方法。它使用-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