У меня есть приложение, которое будет производить большое количество данных, которые я не хочу хранить на диске. Приложение в основном выводит данные, которые я не хочу использовать, но набор полезной информации, которая должна быть разбита на отдельные файлы. Например, с учетом следующего вывода:
JUNK
JUNK
JUNK
JUNK
A 1
JUNK
B 5
C 1
JUNK
Я мог запустить приложение три раза так:
./app | grep A > A.out
./app | grep B > B.out
./app | grep C > C.out
Это даст мне то, что я хочу, но это займет слишком много времени. Я также не хочу записывать все выходные данные в один файл и анализировать его.
Есть ли способ объединить три операции, показанные выше, таким образом, что мне нужно всего лишь запустить приложение один раз и получить три отдельных выходных файла?
./app | tee >(grep A > A.out) >(grep B > B.out) | grep C > C.out
grep
.Вы можете использовать
awk
источник
Вы также можете использовать возможности сопоставления с образцом вашей оболочки :
Или даже:
Более безопасный способ справиться с обратными слешами и строками, начиная с
-
:Как отмечает @StephaneChazelas в комментариях, это не очень эффективно. Лучшее решение, вероятно, @ AurélienOoms ' .
источник
-n
,-e
... Это также будет очень неэффективной , так как это означает , что несколько системных вызовов для каждой строки ( по одномуread(2)
на символ, файл будучи открытым, писать закрыто для каждой строки ...). Как правило, использованиеwhile read
циклов для обработки текста в оболочках является плохой практикой.-n
т. Д. Насколько я могу сказать, обе версии работают нормально с пробелами, правда, я не прав?printf
является формат. Там нет причин оставлять вам переменные без кавычек там.Если у вас несколько ядер и вы хотите, чтобы процессы были параллельными, вы можете сделать:
Это породит три процесса в параллельных ядрах. Если вы хотите, чтобы какой-то вывод выводился на консоль или мастер-файл, он имеет преимущество в том, что вывод выводится в некотором порядке, а не в микшировании.
Утилиту gnu параллельно с Ole Tange можно получить из большинства репозиториев под названием Parallel или moreutils . Источник может быть получен от Savannah.gnu.org . Также вводное учебное видео здесь .
добавление
Используя более свежую версию параллели (не обязательно версию в вашем репозитории), вы можете использовать более элегантную конструкцию:
Это позволяет получить результат запуска одного ./app и трех параллельных процессов grep в отдельных ядрах или потоках (как определено самой параллелью, также следует учитывать, что параметр -j3 является необязательным, но он приведен в этом примере для ознакомительных целей).
Более новую версию параллели можно получить, выполнив:
Затем обычная распаковка, cd to parallel- {date}, ./configure && make, sudo make install. Это установит параллель, страницу руководства параллель и страницу руководства параллельно.
источник
Вот один в Perl:
источник
... если
<in
он доступен для чтения, все три выходных файла будут усечены до того, как им что-либо будет записано.источник