Como faço para analisar uma linha através de um arquivo no bash

0

Eu sou muito novo em scripts de shell. Eu tive uma pequena consulta sobre a análise de arquivos.

Então, aqui está o que estou tentando fazer:
Eu executo um comando svn merge e um arquivo de conflitos genaratea meu arquivo de conflito é armazenado como conflitos.txt

O que eu quero fazer é ler este arquivo linha por linha e analise uma linha para combinar com algumas palavras-chave.

Por exemplo, uma das linhas nos arquivos tem esta aparência:
C Client/Game/src/test/test.php

Agora quero analisar essa linha e pesquisar a palavra-chave test , caso eu a encontre, quero fazer alguma ação nela, por exemplo, abortar com status de saída 2, 3, etc.

por exemplo, eu quero iterar através de um arquivo de texto chamado "FILENAME", que se parece com isso

30 '!' C Client/test.js

31 '!' C Client/test2.js

32 '!' C Client/test3.js '

o que eu estou fazendo é catar o arquivo usando o loop while e cat commnad

cat $FILENAME | while read LINE do echo $LINE done

aqui eu estou apenas imprimindo a linha, eu quero saber como posso procurar por um keyworkd na linha e se eu encontrar essa palavra-chave como posso fazer alguma ação sobre ele como sair com o status 1

Você pode sugerir alguma maneira de fazer isso ...

    
por Riddle 12.06.2013 / 17:12

3 respostas

2

Existem muitas maneiras de fazer isso, dependendo de suas necessidades.

  1. Basta imprimir todas as linhas que contenham a palavra-chave test :

    grep test file.txt
    
  2. O mesmo, mas para muitas palavras-chave. Crie um arquivo que tenha todas as palavras-chave, uma por linha e execute

    grep -f keywords.txt file.txt
    
  3. Processar um arquivo linha por linha, sair se a linha for encontrada

    while read line; do echo $line | grep test && break; done < file.txt
    
  4. Saia com o status 1 se a linha corresponder. Infelizmente, se bem me lembro (não tenho 100% de certeza), bash só permite que você defina valores de retorno em funções. Então, para obter um status de saída, você precisa usar outra coisa. Perl por exemplo:

    perl -ne '/test/ && exit(1)' file.txt
    
  5. Embora não seja possível definir um valor de saída, você ainda pode fazer algo semelhante com o bash. O valor de saída da última execução de comando é sempre salvo como $? no bash, o que significa que você pode testar o valor de $? e agir de acordo:

    while read line; do let c++; echo $line | grep test >/dev/null; 
      if [[ $? == 0 ]] ; then echo Match for line $c : $line;
      else echo No match for line $c; fi  
    done < file.txt 
    
por 12.06.2013 / 19:05
0

A maneira mais simples é não analisar o arquivo linha por linha.

grep -q 'keyphrase' filename && exit <exitcode> 
    
por 12.06.2013 / 18:42
0
$ function some_action { 
    echo found keyword
}

$ if grep -q -m1 -e 'test3' < input;
  then 
      some_action
  fi
found keyword

opções do grep:

  • -q: silencioso; não imprima correspondências
  • -m1: sair após uma correspondência
  • -e: expressão (palavra-chave)

por exemplo:

$ grep . input
30 '!' C Client/test.js
31 '!' C Client/test2.js
32 '!' C Client/test3.js

$ if grep -q -m1 -e 'test3' < input; then some_action ; fi
found keyword
    
por 18.07.2013 / 21:31