Печать подробного прогресса от sed и awk - PullRequest
24 голосов
/ 23 марта 2012

Программы sed и awk обычно работают тихо.Есть ли способ заставить эти программы заявить, что они делают?

Ответы [ 9 ]

8 голосов
/ 04 декабря 2012

Это основано на ответе потонга. Следующий код заменяет 'll' на 'zz', создает файл резервной копии, отображает новый текст и записывает изменения в файл.

$ echo hello > test
$ sed -e 's/ll/zz/;w /dev/stdout' -i .backup test
hezzo
$ cat test
hezzo
$ cat test.backup 
hello
6 голосов
/ 18 июля 2012

Предполагая, что вы передаете вывод sed в файл, вы можете использовать команду tail (в другом терминале), чтобы постоянно просматривать конец файла;так, чтобы вы могли видеть прогресс.

tail -f output_from_sed.txt
5 голосов
/ 23 марта 2012

Это может работать для вас (для sed):

sed -i 's/foo/bar/;w /dev/stdout' files*

Будет напечатано содержимое файла после применения изменения.

4 голосов
/ 23 марта 2012

Вы всегда можете указать awk распечатать входную запись, т.е.

 awk '{ 
       print "#dbg:$0="$0 
       # do more stuff
       print $1
       # or make it conditional
       if ($0 ~ /specialRegEx/){
              print "#dbg:$0="$0 
       }
      }' infile

С помощью sed вы используете 'p' cmd для печати каждой строки, хотя по умолчанию печатается каждая строка. Что-то вроде

 sed 'p
      # also "=" prints line # being processed
      =
      /specialRegEx/{
        s/xxx/yyy/
        p
      }' infile

Надеюсь, это поможет.

4 голосов
/ 23 марта 2012

Если вы перенаправляете вывод sed или awk в файл (вместо изменения файлов на месте), вы можете дать pv («просмотрщик каналов») выстрел:

sed -e '...' input.txt | pv > output.txt

Вы можете использовать pv -l, чтобы он сообщал о прогрессе в написанных строках. Состояние прогресса печатается до stderr, тогда как фактические данные перемещаются от stdin до stdout.

3 голосов
/ 24 марта 2012

Если вы работаете в Linux, вы можете просмотреть ход процесса обработки больших файлов, просмотрев /proc/<pid>/fdinfo.Там есть запись для каждого дескриптора открытого файла, и, если вы просматриваете записи, они показывают вам положение чтения / записи дескриптора файла.Таким образом, вы можете видеть, что вы 1123456 байтов в файл.Имена открытых файлов находятся в другой области: /proc/<pid>/fd, представленной в виде символических ссылок.

Прежде чем я посмотрю на это, я обычно присоединяю strace к процессу: strace -p <pid>.Вы можете использовать это, чтобы посмотреть, какие системные вызовы выполняет процесс: чтение и запись файла и выделение памяти с помощью brk или mmap.

2 голосов
/ 01 августа 2012

Это может быть не совсем то, что вы ищете, но это может помочь кому-то еще. FWIW:
gawk -W dump-variables=/tmp/awk.log
выгрузит значения переменных в конце скрипта в файл журнала.

0 голосов
/ 22 августа 2018

awk вывод на /dev/stderr

Иногда я обрабатываю большие файлы данных, которые содержат блоки из 4 строк (FASTQ), поэтому я часто использую stderr для вывода сообщений о состоянии через регулярные интервалы (каждые 100К строк). Вот базовый шаблон:

#!/usr/bin/awk -f

BEGIN {
    # Check for any expected input variables

    # Status
    print "[INFO] Initiating processing..." > "/dev/stderr";
}
{
    # Do stuff

    # Status
    if (NR % 400000 == 0) {
        printf("[INFO] %d reads processed\n", NR/4) > "/dev/stderr";
    }
}
END {
    # Final status
    printf("[INFO] %d total reads\n", NR/4) > "/dev/stderr";
}
0 голосов
/ 09 февраля 2017

«Правильный» ответ здесь:

pv myfile.txt | sed ...

Ответ Эдуардо Иванека был близок, но с помощью средства просмотра каналов (pv), чтобы выполнить фактический трубопровод, вы узнаете, каков ваш прогресс вфайл (в процентах, включая отличную статистику, такую ​​как M / sec, общее количество данных и т. д.).

pv работает как cat (прочитайте файл и экспортируйте его непосредственно в stdout, или вв случае с подключением это мост между stdin и stdout).

Важно, что, поскольку pv - это «процесс прозрачного канала», stdout занят передачей данных.Таким образом, отчет о проделанной работе сообщается через stderr.

...