Печать подробного прогресса от sed и awk - программирование
Подтвердить что ты не робот

Печать подробного прогресса от sed и awk

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

4b9b3361

Ответ 1

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

$ echo hello > test
$ sed -e 's/ll/zz/;w /dev/stdout' -i .backup test
hezzo
$ cat test
hezzo
$ cat test.backup 
hello

Ответ 2

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

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

Ответ 3

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

tail -f output_from_sed.txt

Ответ 4

Если вы перенаправляете вывод sed или awk в файл (вместо того, чтобы изменять файлы на месте), вы можете дать pv ( "viewer канала" ) снимок:

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

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

Ответ 5

Вы всегда можете указать 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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

pv myfile.txt | sed ...

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

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

Важно отметить, что поскольку pv является "прозрачным процессом", stdout занят ретрансляцией данных. Таким образом, отчет о ходе работы отображается через stderr.