Использование jq в цепочке каналов не дает вывода

Вы также можете использовать sed

$ sed -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT

Чтобы сделать изменение файла напрямую

$ sed -i -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT

Чтобы сохранить исходный файл и перенаправить желаемый вывод на другой

$ sed -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT >> MDD_MODIFFIED.TXT
12
04.04.2018, 06:42
1 ответ

Здесь вы видите буферизацию C stdio в действии. Он будет хранить выходные данные в буфере до тех пор, пока не будет достигнут определенный предел (, который может составлять 512 байт, 4 КБ или больше ), а затем отправить все сразу.

Эта буферизация отключается автоматически, если stdout подключен к терминалу, но когда он подключен к каналу (, например, в вашем случае ), он активирует такое поведение буферизации.

Обычный способ отключения/управления буферизацией — использование функции setvbuf()(см. этот ответ для более подробной информации ), но это необходимо сделать в исходном коде jqсам по себе, так что, возможно, для вас это не практично...

Есть обходной путь... (Можно сказать, хак. )Существует программа под названием "unbuffer", которая распространяется с "expect" и может создать псевдотерминал -и подключить его к программе. Таким образом, несмотря на то, что jqпо-прежнему будет записывать в канал, он будет думать, что записывается в терминал, и эффект буферизации будет отключен.

Установите пакет «expect», который должен поставляться с «unbuffer», если у вас его еще нет... Например, в Debian (или Ubuntu):

$ sudo apt-get install expect

Затем вы можете использовать эту команду:

$ tail -f in.txt | unbuffer -p jq '.f1' | tee out.txt

См. также этот ответ для более подробной информации о "unbuffer", и вы также можете найти справочную страницу здесь .

6
27.01.2020, 19:54

Теги

Похожие вопросы