Imprime números de linhas de arquivos que estou procurando por [closed]

5

Estou procurando uma maneira de imprimir o número de arquivos que meu script está passando. Eu encontrei $LINENO mas quando eu faço

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

Ele imprime os resultados "Encontrado foo no arquivo Foo na linha 97 no arquivo .csv . Eu gostaria que ele imprimisse a linha no arquivo que está olhando e não a linha em que está o script. Como pode Faço eco do número da linha nos arquivos?

    
por DᴀʀᴛʜVᴀᴅᴇʀ 23.08.2013 / 17:40

2 respostas

11

Você pode usar nl para numerar as linhas do arquivo antes de passar por elas:

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

Observe que -b a é obrigatório porque, por padrão, nl não faz o número de linhas em branco.

Claro, isso será ineficiente se o arquivo for muito grande, pois ele será executado duas vezes no arquivo.

Talvez uma alternativa melhor seja usar seu próprio contador de linha para que você só precise acessar o arquivo uma vez:

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

Isso só funcionará se você estiver processando o arquivo linha por linha. Não funcionará se você estiver usando grep , por exemplo.

    
por 23.08.2013 / 17:57
2

A maneira que encontrei para fazer isso é usar trap DEBUG para armazenar o número da linha atual para uma variável secundária e trap ERR para despejá-los:

#!/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

Isso será impresso no console:

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

e armazenar em logfile :

ERROR in file test.bash on line 8

Para mostrar o script:

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

E para mostrar a linha desejada (corrompida):

sed -ne 8p <test.bash
bla
    
por 23.08.2013 / 19:08