Execute o comando uma vez e filtre a saída em múltiplos arquivos [duplicados]

0

Existe alguma maneira de redirecionar a saída filtrada para vários arquivos executando mycommand.sh apenas uma vez?

Exemplo de saída deve ser semelhante a isto:

mycommand.sh | grep --line-buffered -B 1 A >> file1 ; my command.sh | grep --line-buffered -A 1 B >> file2

Ou talvez com o egrep de alguma forma ...

    
por Futur'Fusionneur 25.01.2018 / 12:38

2 respostas

2

Com o comando awk :

mycommand.sh | awk '/A/{ print > "file1" }/B/{ print > "file2" }'
  • /A/{ print > "file1" } - se um registro corresponder ao padrão A print / redirect o registro inteiro em file1
por 25.01.2018 / 12:48
2
O

awk é uma ferramenta melhor para isso porque é muito mais rápido, não precisa forçar o grep ou o que quer que seja várias vezes, e pode ser dimensionado facilmente para gravar em qualquer número de arquivos. Idem para a maioria das outras linguagens de script, como perl ou python .

No shell, você pode usar tee e substituição de processos . por exemplo,

mycommand.sh |
  tee >(grep --line-buffered -A 1 B >> file2) |
  grep --line-buffered -B 1 A >> file1

(extras alimentações de linha e recuo adicionadas para melhorar a legibilidade. funciona tudo em uma linha, se você preferir feio e ilegível)

tee escreve sua entrada para ambos stdout (por exemplo, para o terminal, redirecionado para um arquivo ou canalizado para o próximo comando na linha de controle) AND para um arquivo especificado na linha de comando.

Nesse caso, esse "arquivo" é um descritor de arquivo fornecido pela substituição do processo (por exemplo, outro comando grep com saída redirecionada, como no exemplo acima).

tee pode gravar em vários arquivos de saída (ou descritores de arquivo de substituição de processo) simultaneamente. Por exemplo:

mycommand.sh |
  tee >(grep --line-buffered -A 1 B >> file2) \
    >(grep --line-buffered -A 1 C >> file3) \
    >(grep --line-buffered -A 1 D >> file4) |
  grep --line-buffered -B 1 A >> file1

Isso funciona, mas eu pessoalmente usaria algo como awk answer do @ RomanPerekhrest.

    
por 25.01.2018 / 14:45