Відповіді:
Ви можете використати awk
для цього.
command | awk '{ if (/pattern/) { print > "match" } else { print > "nomatch" } }'
>
друкує весь вихід у файл, перезаписуючи наявні файли. Це не оцінюється таким чином, що це призведе до того, що будь-які нові рядки перезаписують старий вихід із того ж екземпляра awk
. Тобто, якщо є декілька збігів, файл "матч" буде містити кожен збіг, розділений на OFS
. Різниця між >
і >>
існує в обробці існуючих файлів.
Ось sed
приклад:
Примітка: w
команда sed замінить існуючий файл щоразу, коли сценарій запускається, але лише в тому випадку, якщо саме ця команда запису запускається; звідсиrm
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
Ви можете додавати файли у відмінному режимі:
awk '{if (/pattern/) print >>"matched"; else print >>"unmatched"; }
або коротше:
awk '{print >>(/pattern/?"matched":"unmatched")}'
awk
але в який момент він оцінює>
? Якщо це оцінюється щоразу, коли застосовується умовне, ви закінчите два однорядкові файли ...