Um while ou até loop, até uma linha com o conteúdo “REMOVE” no bash. Como eu faço isso?

1

Eu quero endereçar endereços IP em um arquivo até a linha com o conteúdo "REMOVER". Eu tentei o seguinte, mas o script dá todo o IP, inclusive depois de "REMOVER".

a="[A-Z]"

cat *.txt| until [[ "$a" =  "REMOVE" ]]; do grep -oE "([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}"; done
    
por Pheeb 20.04.2014 / 19:29

1 resposta

1

faça isso com um sedelinerante:

sed -n -s -r '1,/REMOVE/ { s/.*(([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}).*//p }' *.txt

explicação:

  • -n faz com que sed não imprima linhas, a menos que seja explicitamente informado usando o comando p .
  • -s faz o sed manipular cada arquivo separadamente, em vez de combinar todos os arquivos em um fluxo.
  • -r faz com que o sed use a sintaxe de regex estendida, que precisa de menos escape.

observe que -s e -r são extensão do gnu para sed. Se você não sabe o que significa extensão gnu, então provavelmente você está usando o gnu sed. Se você não estiver usando um gnu sed, então você tem que contornar os recursos que faltam.

mais explicações:

  • o script sed 1,/REMOVE/ { commands } significa executar os comandos dentro das chaves desde a primeira linha da entrada até a linha contendo REMOVE .
  • o script sed s/pattern/replacement/p significa pesquisar por padrão, substituir por substituição e depois imprimir essa substituição.
  • o padrão .*(([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}).* é um padrão que reconhece todas as linhas que contêm uma cadeia de quatro números de três dígitos separados por pontos. Ele também captura a cadeia em um grupo chamado.
  • a referência de retorno faz referência ao primeiro dos grupos capturados. isso significa, na verdade, descartar o restante da linha e imprimir apenas o endereço IP.

leia o manual de segurança para maiores explicações. veja também o bom tutorial sed .

    
por 20.04.2014 / 23:28

Tags