pcregrep
работы:
pcregrep -M \
'DEBUG.*output:\n===*\n.*?\n.*?USER_ID.*?"AAA".*?(\n*?.*?\n*)*?===*' AppLog.txt
Это проверено в csh, tcsh, sh, ksh, zsh, bash, ash, sash:
echo foo > the-file
(rm the-file; cat) < the-file | do_slow_processing
или, если хотите,:
(rm the-file; do_slow_processing) < the-file
Интересно, что это работает и для fifos:
mkfifo the-fifo
(rm the-fifo; cat) < the-fifo | do_slow_processing &
echo foo > the-fifo
Это связано с тем, что ридер блокируется до тех пор, пока что-то не будет записано.
generate-the-file > the-file
exec 5< the-file
rm the-file
...
do_slow_processing 0<&5
Примечания:
cat 0<&5
)завершатся ошибкой, так как вы находитесь в EOF. Вам нужно будет перемотать его или преодолеть, прочитав через/proc/self/fd/X
generate-the-file | do_slow_processing
Обновление:
В OP упоминается, что generate-the-file
может не выводить вывод на стандартный вывод. Для этого есть несколько идиом:
-
. Принято принимать имя выходного файла -для обозначения stdout. Это признано POSIX.1 -2017 :.Guideline 13: For utilities that use operands to represent files to be opened for either reading or writing, the '-' operand should be used to mean only standard input (or standard output when it is clear from context that an output file is being specified) or a file named -.
(для утилит, отличных от тех, где они явно определяют это, это определено в реализации -, но есть большая вероятность, что оно поддерживается вашим generate-the-file
инструментом)
Используйте /dev/stdout
или /proc/self/fd/1
. Зависит от ОС, см. Насколько переносимы /dev/stdin, /dev/stdout и /dev/stderr?
Использовать замену процесса. bash позволит вам написать >(process substitution)
в качестве имени файла. Например:
wget -O >(rot13 > question.txt) https://unix.stackexchange.com/q/579535/70346
Это не будет работать во всех оболочках и требует, чтобы ОС поддерживала имена файлов fd.