私が探しているファイルの行番号を印刷してください。 [閉じる]

私が探しているファイルの行番号を印刷してください。 [閉じる]

私はスクリプトが進行中のファイルの行番号を印刷する方法を探しています。わかったけど$LINENO、知ってみたら

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

FooファイルにあるFooファイルの97行目に見つかったFooという結果を印刷します.csv。スクリプト行ではなく、現在見ているファイルの行を印刷したいと思います。ファイルの行番号をどのようにエコーしますか? ?

答え1

nlファイルに移動する前に、ファイル行に番号を付けることができます。

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

デフォルトでは、空行には番号が付けられていない-b aため、これは必須です。nl

もちろん、ファイルが非常に大きい場合、ファイルを2回繰り返すので、これは非効率的です。

おそらく、より良いオプションは、ファイルを一度だけナビゲートしたい場合は、独自の行カウンタを使用することです。

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

これは、ファイルを1行ずつ処理する場合にのみ機能します。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

関連情報