Réponses:
Vous pouvez l'utiliser awkpour cela.
command | awk '{ if (/pattern/) { print > "match" } else { print > "nomatch" } }'
>imprime toutes les sorties dans le fichier, écrasant les fichiers existants. Il n'est pas évalué de manière à ce que toutes les nouvelles lignes écrasent l'ancienne sortie de la même instance de awk. Autrement dit, s'il existe plusieurs correspondances, le fichier "correspondance" contiendra chaque correspondance séparée par OFS. La différence entre >et >>existe dans le traitement des fichiers existants.
Voici un sedexemple:
Remarque: la wcommande de sed écrasera un fichier existant à chaque exécution du script, mais uniquement si cette commande d'écriture particulière est déclenchée; d'où lerm
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
Vous pouvez ajouter des fichiers dans awk:
awk '{if (/pattern/) print >>"matched"; else print >>"unmatched"; }
ou plus court:
awk '{print >>(/pattern/?"matched":"unmatched")}'
awkmais à quel moment évalue->t- il le ? Si elle est évaluée à chaque fois que le conditionnel s'applique, vous vous retrouvez avec deux fichiers d'une ligne ...