Как в реальном времени выводить с помощью grep результат, содержащий индикатор выполнения?

Я бы использовал awk:

$ awk 'NR>1{$1=$1"_i1"}1;' test.txt 
        A1A A1B A1C A1D A1E 
TR6764_c0_g2_i1 0.00 0.02 0.00 0.00 0.00
TR25644_c0_g1_i1 0.00 0.00 0.00 0.00 0.00
TR4897_c0_g1_i1 58.50 177.26 130.35 8.52 102.66
TR900_c0_g2_i1 0.00 0.00 0.00 0.00 0.00

Или, если вам нужно сохранить пробелы неизменными, perl:

$ perl -pe 's/\s/_i1$&/ if $.>1' test.txt 
        A1A A1B A1C A1D A1E 
TR6764_c0_g2_i1    0.00    0.02    0.00    0.00    0.00   
TR25644_c0_g1_i1   0.00    0.00    0.00    0.00    0.00   
TR4897_c0_g1_i1    58.50   177.26  130.35  8.52    102.66  
TR900_c0_g2_i1     0.00    0.00    0.00    0.00    0.00    
4
03.05.2017, 23:51
2 ответа

Это своего рода хакерский / необычный ответ, факт в том, что это, скорее всего, возможно не очень чистым способом.


grep , похоже, печатает вывод только тогда, когда он встречает символ новой строки, ваш индикатор выполнения, вероятно, не вводит символ новой строки при обновлении, следовательно, ваша проблема.

strace - это инструмент, используемый для просмотра системных вызовов, вызываемых командой, включая такие вещи, как чтение и запись в память / хранилище, а также такие вещи, как открытие / закрытие файловых дескрипторов.


С помощью strace вы можете видеть, к какому процессу обращается процесс, в случае вашего канала stout передается в grep , поэтому с помощью strace вы можете просмотреть текст, который передается в grep . strace будет регулярно отправлять вывод, поступающий из конвейерной команды, и вы можете прослушать этот вывод и отобразить его. Я тестировал с помощью rsync --progress , что похоже на аналогичный сценарий. Я использовал grep на ##% , потому что это то, что rsync использует для отображения прогресса.

rsync --progress file1 file2 | strace -e trace=read grep "[0-9]*%"

Если вы запустите эту команду, вы обнаружите, что strace не дает хороших результатов, но когда я использовал его strace поймал пару прочитанных ] s из rsync , что grep обычно не записывает , показывая read s для 0%, 21%, 45%, 68 %, 91% и 100%, казалось, обновлялись каждую секунду (вероятно, в зависимости от того, как часто rsync обновляет прогресс).

Таким образом, вы можете grep вывод strace , что не очень хорошо, снова вызвав тот же grep .

rsync --progress file1 file2 | strace -e trace=read grep "[0-9]*%" 2>&1 > /dev/null | grep -o "[0-9]*%"

2> & 1 важен, потому что strace печатается на stderr . > / dev / null перенаправляет stdout на / dev / null , чтобы предотвратить вывод первого сообщения grep . Конечным результатом этого был следующий результат:

0%
21%
45%
68%
91%
100%

Вам придется заменить grep , но похоже, что это поможет. Это некрасиво, но работает и работает в обход ограничений grep . Похоже, grep -f , который работает как tail -f , будет удобен (я знаю, что grep -f уже используется).

Первый grep в основном предназначен для фильтрации текста, который strace будет прочитан , поскольку в будут перечислены только совпадающие строки. ] strace s читает вызовы, но вам также нужно что-то для перемещения текста, чтобы strace мог его смотреть.

4
27.01.2020, 20:53

Я подробно останавливаюсь на ответе Сантимана, поскольку окончательный ответ довольно сложен.

Это уже было довольно хакерским ... теперь оно стало действительно дерьмовым:

make flash \
    |& strace -e trace=read grep -e "^\." -e rror \
    |& stdbuf -o0 sed -ne 's/^.*"\.".*/\./p;/rror/p' \
    | stdbuf -o0 tr -d '\n' \
    ; echo

Итак, make flash выше вызывает openocd ;

strace использует Уловка Centimane, описанная выше:

sed заменить read (0, ".", Xxx) строк на одинарные . ;

tr сохраняет все . в одной строке, а final echo помещает единственный EOL.

В дополнение к этому, sed и tr вызываются с помощью stdbuf -o0 , который устанавливает размер буфера стандартного вывода равным 0 (поскольку EOL удален), и grep / sed также сопоставляют (e) rror для вывода мусора в случае ошибки.

Я попытался свести все это раздувание к минимуму, но не смог.

Также обратите внимание, что я использую zsh / Ubuntu 14.04, и я не уверен, что это может работать в других Unix.

3
27.01.2020, 20:53

Теги

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