Respostas:
Você poderia usar awk
para isso.
command | awk '{ if (/pattern/) { print > "match" } else { print > "nomatch" } }'
>
imprime toda a saída no arquivo, substituindo os arquivos existentes. Não é avaliado de tal maneira que resultará em novas linhas substituindo a saída antiga da mesma instância de awk
. Ou seja, se houver várias correspondências, o arquivo "correspondência" conterá cada correspondência separada por OFS
. A diferença entre >
e >>
existe no tratamento de arquivos existentes.
Aqui está um sed
exemplo:
Nota: o w
comando sed irá substituir um arquivo existente toda vez que o script for executado, mas apenas se esse comando de gravação específico for acionado; daí orm
rm -f file-{yes,not}
sed -ne '/pattern/bY; w file-not' -e 'b; :Y; w file-yes' file
sed -n '/PATTERN/p;//! w file-not' infile >file-yes
Você pode anexar arquivos no awk:
awk '{if (/pattern/) print >>"matched"; else print >>"unmatched"; }
ou mais curto:
awk '{print >>(/pattern/?"matched":"unmatched")}'
awk
mas em que momento ele avalia o>
? Se é avaliada cada vez que o condicional aplica-se, você ia acabar com dois arquivos de uma linha ...