내가 찾고 있는 파일의 줄 번호를 인쇄하세요. [닫음]

내가 찾고 있는 파일의 줄 번호를 인쇄하세요. [닫음]

내 스크립트가 진행 중인 파일의 줄 번호를 인쇄하는 방법을 찾고 있습니다. 알았지만 $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

관련 정보