xargs sintaxe de uso

2

Estou tentando pesquisar uma string específica dentro de arquivos compactados, mas não consigo obter a sintaxe 'xargs' correta.

Os arquivos descompactam / zipam corretamente, mas o xargs está realmente procurando por nada (estamos procurando por TLS EMails com falha).

Alguém pode me dar algumas dicas sobre a sintaxe correta do xargs?

for filename in $( ls -1 ${HOST}-mail-2018${1}[0-9][0-9]* )
do
  filetype=${filename##*.}
  case $filetype in
    bz2)
        unzipper="bzip2 -d "
        zipper="bzip2"
        unzfile=${filename%.${filetype}}
        ;;
    gz)
        unzipper="gzip -d "
        zipper="gzip "
        unzfile=${filename%.${filetype}}
        ;;
    xz)
        unzipper="xz -d "
        zipper="xz "
        unzfile=${filename%.${filetype}}
       ;;
    *)
        echo "Unknown compression type for file $filename"
        break
        ;;
   esac
        #  Testing:    echo $unzipper $zipper $unzfile
        echo $unzipper $zipper $filename $unzfile

   eval ${unzipper} ${filename}
   grep 'Cannot .*TLS' ${unzfile} | sed 's/^.*]: //' | sed 's/:.*//' |  xargs fgrep
   eval ${zipper} ${unzfile}
done
exit 0
    
por mintster 16.10.2018 / 11:36

1 resposta

3
for filename in "$HOST-mail-2018$1"[0-9][0-9]*; do
    case $filename in
        *.gz)  g=zgrep  ;;
        *.bz2) g=bzgrep ;;
        *.xz)  g=xzgrep ;;
        *) printf 'Unknown filetype for "%s"\n' "$filename" >&2
           exit 1   # or continue or break
    esac

    "$g" 'Cannot .*TLS' "$filename"
done

Cada ferramenta de compactação vem com uma ferramenta grep correspondente. Estes são, para gzip , bzip2 e xz , chamados zgrep , bzgrep e xzgrep , respectivamente. Ao usá-los, não é necessário descompactar e recompactar os arquivos explicitamente.

O script acima seleciona o grep correto, dependendo do sufixo do arquivo. Pode-se usar indiscutivelmente grep para qualquer sufixo desconhecido. Veja abaixo como fazer isso sem observar os sufixos de nome de arquivo (usando a ferramenta file ).

Note como nós não precisamos usar ls para fazer um loop sobre o conjunto de arquivos, e que as expansões de variáveis precisam ser duplamente citadas.

Eu ignorei as chamadas sed que você tem em seu código, pois não sei qual é o propósito delas. Também removi o exit 0 no final do código, pois isso mascararia qualquer outro status de saída do script se ele saísse do loop.

Usando o tipo MIME de um arquivo para selecionar a ferramenta correta grep :

for filename in "$HOST-mail-2018$1"[0-9][0-9]*; do
    case $( file -b -i "$filename" ) in
        text/plain*)          g=grep   ;;
        application/x-gzip*)  g=zgrep  ;;
        application/x-bzip2*) g=bzgrep ;;
        application/x-xz*)    g=xzgrep ;;
        *) printf 'Unknown filetype for "%s"\n' "$filename" >&2
           exit 1   # or continue or break
    esac

    "$g" 'Cannot .*TLS' "$filename"
done

Isso selecionaria corretamente a ferramenta grep correta, independentemente do sufixo do nome do arquivo (desde que o arquivo fosse de um dos tipos de arquivos suportados). Eu também adicionei grep para arquivos de texto comuns.

Relacionados:

por 16.10.2018 / 12:07