Eu tenho um aplicativo que produzirá uma grande quantidade de dados que não desejo armazenar no disco. O aplicativo emite principalmente dados que não desejo usar, mas um conjunto de informações úteis que devem ser divididas em arquivos separados. Por exemplo, dada a seguinte saída:
JUNK
JUNK
JUNK
JUNK
A 1
JUNK
B 5
C 1
JUNK
Eu poderia executar o aplicativo três vezes da seguinte maneira:
./app | grep A > A.out
./app | grep B > B.out
./app | grep C > C.out
Isso me daria o que eu quero, mas levaria muito tempo. Também não quero despejar todas as saídas em um único arquivo e analisar isso.
Existe alguma maneira de combinar as três operações mostradas acima de forma que eu só precise executar o aplicativo uma vez e ainda assim obter três arquivos de saída separados?
./app | tee >(grep A > A.out) >(grep B > B.out) | grep C > C.out
grep
.Você pode usar
awk
fonte
Você também pode usar as habilidades de correspondência de padrões do seu shell :
Ou até:
Uma maneira mais segura de lidar com barras invertidas e linhas começando com
-
:Como @StephaneChazelas aponta nos comentários, isso não é muito eficiente. A melhor solução é provavelmente a @ AurélienOoms .
fonte
-n
,-e
... Ele também vai ser terrivelmente ineficiente, já que significa várias chamadas do sistema por linha (umread(2)
por personagem, o arquivo ser aberto, escrita fechado para cada linha ...). Geralmente, usarwhile read
loops para processar texto em shells é uma prática ruim.-n
etc. Tanto quanto eu posso dizer, ambas as versões funcionam bem com espaços em branco, estou errado?printf
é o formato. Não há razão para deixar suas variáveis sem aspas lá.Se você possui vários núcleos e deseja que os processos sejam paralelos, é possível:
Isso gerará três processos em núcleos paralelos. Se você deseja que haja alguma saída para o console ou um arquivo mestre, ele tem a vantagem de manter a saída em alguma ordem, em vez de misturá-la.
O utilitário gnu paralelo de Ole Tange pode ser obtido na maioria dos repositórios com o nome paralelo ou moreutils . A fonte pode ser obtida em Savannah.gnu.org . Também um vídeo instrutivo introdutório está aqui .
Termo aditivo
Usando a versão mais recente do paralelo (não necessariamente a versão em seu repositório de distribuição), você pode usar a construção mais elegante:
O que alcança o resultado da execução de um ./app e 3 processos grep paralelos em núcleos ou encadeamentos separados (conforme determinado pelo próprio paralelo, também considera o -j3 opcional, mas é fornecido neste exemplo para fins instrutivos).
A versão mais recente do paralelo pode ser obtida fazendo:
Em seguida, descompacte o arquivo usual, cd to parallel- {date}, ./configure && make, sudo make install. Isso instalará paralelo, página de manual paralela e página de manual paralela_tutorial.
fonte
Aqui está um em Perl:
fonte
... se
<in
for legível, todos os três arquivos serão truncados antes que algo lhes seja gravado.fonte