Como posso redirecionar as linhas correspondentes para um arquivo e as linhas não correspondentes para um arquivo diferente?

13

Existe um script / programa / utilitário já disponível para o seguinte requisito de maneira otimizada?

someCommand |
   tee >(grep "pattern" > LinesWhichMatch) |
   grep -v "pattern" > LinesWhichDoesNotMatch
    
por balki 21.09.2011 / 21:25

3 respostas

16

Você pode usar awk para isso.

command | awk '{ if (/pattern/) { print > "match" } else { print > "nomatch" } }'
    
por 21.09.2011 / 21:51
10

Aqui está um exemplo de sed :
Nota: o comando w do sed irá sobrescrever um arquivo existente sempre que o script for executado, mas somente se esse comando de gravação específico for acionado; daí o rm

rm -f file-{yes,not}  
sed -ne '/pattern/bY; w file-not' -e 'b; :Y; w file-yes' file
    
por 22.09.2011 / 05:49
6

Você pode acrescentar arquivos no awk:

awk '{if (/pattern/) print >>"matched"; else print >>"unmatched"; }

ou menor:

awk '{print >>(/pattern/?"matched":"unmatched")}'
    
por 22.09.2011 / 00:37