Encontre string no arquivo de texto e execute um script dependendo do resultado

0

Eu tenho um arquivo (Data.txt) com algo parecido com isto:

A=1234597890 B=192.168.1.1

às vezes B vai primeiro e às vezes apenas A ou B.

Então, se eu encontrar:

  A,    Print A content and execute A script
  B,     "    B    "     "    "     B   "
 A&B,    "   A&B   "     "    "     A   "
Neither, Print a error message

Agora o problema é que o conteúdo em A ou B não é sempre o mesmo!

Eu não sei qual seria o melhor comando para usar.

Obrigado por sua ajuda e por tentar entender meu inglês básico:)!

    
por M_Mike 31.10.2014 / 18:43

1 resposta

1

Você pode fazer isso em Perl:

$ perl -lne 'if(/A=([^\s]+)/){print "A : $1"; 'scriptA.sh'} 
           if(/B=([^\s]+)/){print "B : $1"; 'scriptB.sh'}' Data.txt

Explicação

  • -lne : remova as novas linhas à direita de cada linha de entrada e adicione uma nova linha a cada chamada de print ( -l ); leia o arquivo linha por linha ( -n ) e execute o script fornecido por -e em cada linha.
  • if(/A=([^\s]+)/){print "A : $1"; 'scriptA.sh'} : se essa linha corresponder a A= something, imprima A : something (os parênteses significam que o padrão é capturado e agora é salvo como $1 ) e, em seguida, execute scriptA .
  • if(/B=([^\s]+)/){print "B : $1"; 'scriptB.sh'} : como acima, mas para B.

Ou você pode simplesmente extrair os valores e analisá-los:

$ grep -Po '[AB]=[^\s]+' Data.txt | 
    while IFS="=" read name val; do 
        echo "$name=$val"; 
        [ "$name" = "A" ] && scriptA.sh || scriptB.sh; 
    done

Explicação

  • grep -Po '[AB]=[^\s]+' Data.txt : o -P ativa PCREs , e o -o fará com que grep imprima cada correspondência uma linha diferente. O [AB]=[^\s]+ significa "corresponder A ou B e, em seguida, = , em seguida, quantos caracteres não-whitespace forem possíveis. A saída disso é a coleção completa de A=foo e B=bar de seu arquivo de entrada, cada um em seu própria linha.
  • while IFS="=" read name val : defina o separador de campo ionput como = e leia duas variáveis. Isso significa que $name será A ou B e $value será o valor associado a eles.
  • echo "$name=$val"; : imprima-os, altere o formato para o que quiser.
  • [ "$name" = "A" ] && scriptA.sh || scriptB.sh; : se $name for A , execute scriptA.sh , caso contrário, execute scriptB.sh . Ambas as soluções acima assumem que os scripts que você deseja chamar são scriptA.sh e scriptB.sh e que estão em seu $ PATH. Edite de acordo.
por 31.10.2014 / 19:10