私はスクリプトが進行中のファイルの行番号を印刷する方法を探しています。わかったけど$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