打印我正在搜索的文件的行号

打印我正在搜索的文件的行号

我正在寻找一种方法来打印我的脚本正在经历的文件的行号。我发现了$LINENO,但是当我发现的时候

echo 'Found foo in file' $(basename $foo) 'on line' $LINENO >> foo.csv

它打印结果“在文件的第 97 行找到 foo 在文件 Foo 中.csv。我希望它打印它正在查看的文件中的行,而不是它所在的脚本行。我如何回显中的行号文件?

答案1

您可以nl在浏览文件之前对文件的行进行编号:

$ cat testfile
a
b
c
$ nl -b a testfile
   1 a
   2 b
   3 c

请注意,这-b a是必需的,因为默认情况下nl不对空行进行编号。

当然,如果您的文件非常大,这将是低效的,因为它会遍历该文件两次。

也许更好的选择是使用您自己的行计数器,这样您只需浏览该文件一次:

COUNT=0
while read -r line; do
    COUNT=$(( $COUNT + 1 ))
    if [ ... ];then
        # Do things to the line
        # Make use of COUNT to show line number
    fi
done < your_file_here

仅当您逐行处理文件时,这才有效。如果您使用grep例如,它将不起作用。

答案2

我发现执行此操作的方法是将trap DEBUG当前行号存储到辅助变量 trap ERR转储它们:

#!/bin/bash

trap 'LASTLINENO=$_LINENO;_LINENO=$LINENO' DEBUG
trap 'echo ERROR in file" $(basename $0) on line $LASTLINENO" >>logfile' ERR

echo test
test echo
bla

这将在控制台上打印:

test
./test.bash: line 8: bla: command not found

并存储在日志档案:

ERROR in file test.bash on line 8

用于显示脚本:

cat -n test.bash
     1      #!/bin/bash
     2
     3      trap 'LASTLINENO=$_LINENO;_LINENO=$LINENO' DEBUG
     4      trap 'echo ERROR in file" $(basename $0) on line $LASTLINENO"' ERR
     5
     6      echo test
     7      test echo
     8      bla

并显示所需的(损坏的)行:

sed -ne 8p <test.bash
bla

相关内容