Пока stdout
и stderr
буферизированы по строкам, а строки одного из двух всегда являются пятнистыми, их смешивание не является проблемой: рассмотрите вывод программы где оба stdout
и stderr
буферизированы по строке, а stderr
легко разбивается на пятна:
$ cat file
xxxxxxxxxx
tar: ----------
yyyyyyyyyy
tar: ----------
zzzzzzzzzz
tar: ----------
Извлечение любого из двух с помощью grep
] не проблема:
$ < file grep -v ^tar
xxxxxxxxxx # stdout line 1
yyyyyyyyyy # stdout line 2
zzzzzzzzzz # stdout line 3
$ < file grep ^tar
tar: ---------- # stderr line 1
tar: ---------- # stderr line 2
tar: ---------- # stderr line 3
Однако рассмотрим случай, когда в какой-то момент поведение буферизации stdout
меняется на, скажем, небуферизованное:
x
tar: ----------
xxxxxxxxxyyy
tar: ----------
yyyyyyyzzzzz
tar: ----------
zzzzz
Извлечение stdout
с использованием grep
является проблемой:
$ < file grep -v ^tar
x # wrong stdout line 1
xxxxxxxxxyyy # wrong stdout line 2
yyyyyyyzzzzz # wrong stdout line 3
zzzzz # wrong stdout line 4
Попробуйте вместо этого:
< file perl -0777pe 's/\n?tar: [^\n]*\n//g' > newfile
Что, за исключением случаев [edge], должно извлечь исходный stdout
из файла:
$ < file perl -0777pe 's/\n?tar: [^\n]*\n//g'
xxxxxxxxxxyyyyyyyyyyzzzzzzzzzz