Программы sed
и awk
обычно работают спокойно. Есть ли способ заставить эти программы указать, что они делают?
Печать подробного прогресса от sed и awk
Ответ 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
.