내 스크립트가 진행 중인 파일의 줄 번호를 인쇄하는 방법을 찾고 있습니다. 알았지만 $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
물론 파일이 매우 큰 경우 파일을 두 번 반복하므로 이는 비효율적입니다.
아마도 더 나은 옵션은 파일을 한 번만 탐색하면 되도록 자체 라인 카운터를 사용하는 것입니다.
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