Réponses:
Vous pouvez l'utiliser awk
pour 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 sed
exemple:
Remarque: la w
commande 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")}'
awk
mais à 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 ...