Como ler um arquivo de texto linha por linha, que não é constante em scripts de shell

3

Eu preciso ler um arquivo de texto linha por linha e as linhas não são constantes, pode variar.Por exemplo

$ cat file1.txt
syntax error at or near "?" at character 1
syntax error at or near "[" at character 1
syntax error at or near "," at character 1
syntax error at or near "desc" at character 1
syntax error at or near "describtion" at character 1 '

Depois de ler essa linha, ela deve passar automaticamente para o comando grep e me fornecer o conjunto de resultados. Desde o número de linhas & os erros capturados no arquivo de texto não são previsíveis. Tudo precisa ser feito automaticamente

$ find file1.txt | xargs grep 'syntax error at or near "?" at character 1' | tail -1

Como posso colocar a segunda linha, terceira linha ... nth linha & automatizá-lo no script de shell.

    
por user3359124 24.07.2014 / 13:52

3 respostas

1

Você pode usar o comando read para ler o arquivo linha por linha. Por exemplo:

while read -r line
 do 
 [[ $line = 'syntax error at or near "?" at character 1' ]] &&  printf '%s\n' "$line"
 done < file1.txt
    
por 24.07.2014 / 14:15
1

Se eu entendi corretamente, você quer que grep opere nas linhas 1 para n apenas. Para este propósito, você pode usar a ferramenta head :

head -n 20 your_file | grep ...

Isso fará o grep operar nas primeiras 20 linhas de your_file . Substitua 20 pelo n relevante para você.

Uma interpretação alternativa e resposta

Ocorreu-me que pode querer dizer que file1.txt contém padrões que gostariam de que grep tentasse corresponder. Se for , você deseja a opção -f para grep :

grep -f file1.txt files_you_want_to_search

A opção -f informa grep para obter seus padrões de file1.txt , onde assume um padrão por linha (como você mostra em sua postagem). Nesses casos, você também pode adicionar a opção -F para garantir que os metacaracteres de expressão regular no arquivo não recebam o significado especial, mas sejam interpretados literalmente:

grep -Ff file1.txt files_you_want_to_search
    
por 24.07.2014 / 14:50
1

Com base nos seus esclarecimentos em vários comentários, parece que você deve usar a opção -f do grep para ler uma lista de padrões diretamente do arquivo

   -f FILE, --file=FILE
          Obtain  patterns  from  FILE,  one  per  line.   The  empty file
          contains zero patterns, and therefore matches nothing.   (-f  is
          specified by POSIX.)

Você pode adicionar -F para forçar a interpretação como sequências literais ("fixas"), a menos que o arquivo contenha padrões de expressão regulares, por exemplo,

grep -Ff file_of_lines file_to_search_for_those_lines

O resultado será uma lista de todas as linhas em file_to_search_for_those_lines que correspondem a qualquer uma das strings em file_of_lines .

    
por 24.07.2014 / 15:14