程序sed
和awk
通常会安静地工作。有什么办法让这些程序说明他们在做什么?从sed和awk打印详细进度
回答
如果你的sed
或awk
输出重定向到一个文件中(而不是就地修改文件),你可以给pv
(“管子观众”)一拍:
sed -e '...' input.txt | pv > output.txt
您可以使用pv -l
以使其报告书面进度。进度状态打印到stderr
,而实际数据从stdin
到stdout
。
您可以随时告诉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
我希望这有助于。
这可能会为你(对SED)工作:
sed -i 's/foo/bar/;w /dev/stdout' files*
如果你是在Linux上,你可以通过观察/proc/<pid>/fdinfo
查看进程,正在处理大量文件的进度。每个打开的文件描述符都有一个入口,如果你捕获这些入口,它们将显示文件描述符的读/写位置。所以你可以看到你是1123456
字节的文件。打开文件的路径名称位于另一个区域:/proc/<pid>/fd
,表示为符号链接。
在我看之前,我通常附加一个strace
进程:strace -p <pid>
。您可以使用它来查看进程正在进行的系统调用:文件读取和写入以及使用brk
或mmap
进行的内存分配。
为了方便起见:'ps ax | grep foo',其中'foo'是相关程序的名称,可用于查找以上使用的进程标识。 – 2017-10-28 02:36:56
假设您将sed输出管道输出到文件,您可以使用tail命令(在另一个终端中)不断查看文件末尾;这样你就可以看到进展。
tail -f output_from_sed.txt
这可能不是你正在寻找的东西,但它可能会帮助别人。 FWIW:
gawk -W dump-variables=/tmp/awk.log
会将脚本末尾的变量值转储到日志文件中。
这是基于potong的答案。以下代码用'zz'替换'll',创建备份文件,显示新文本并将更改写入文件。
$ echo hello > test
$ sed -e 's/ll/zz/;w /dev/stdout' -i .backup test
hezzo
$ cat test
hezzo
$ cat test.backup
hello
在较新的sed版本中,如果忽略w之前的分号,则w将成为“s”sed命令的参数,并且只有更改写入到/ dev/stdout,这对我来说比编写整个文件更有用 – Jack 2017-01-31 19:41:12
“正确”的答案这里是
pv myfile.txt | sed ...
爱德华伊万内茨的回答很接近,但通过使用管道查看器(PV)做实际的管道,你了解你的进步是什么(如百分比,包括像M/sec这样的高统计数据,总数据等)。
pv
作品像cat
(读取该文件,并直接导出为stdout
,或者在管道中的情况下,它的stdin
和stdout
之间的桥梁)。
重要的是,由于pv
是一个“透明管道进程”,stdout被中继数据占用。所以进度报告通过stderr
报告。
请注意,这不适用于就地替换...(AFAIK) – starryknight64 2017-06-13 21:16:59
- 1. SED/AWK/grep的打印下一行
- 2. 打印的详细信息 - C++
- 3. 试图让GetPrimaryMACAddress停止打印详细
- 4. AWK/SED:文件和打印一切的匹配模式之间
- 5. 打印ZPL斑马打印机项目详细信息
- 6. 用awk打印
- 7. 在AWK打印
- 8. 从打印到word文档的详细信息,然后打印到打印机c#
- 9. AWK打印模式
- 10. 在AWK打印是
- 11. 如何使用sed,awk或gawk打印只匹配的内容?
- 12. 如何使用grep或awk或sed ..根据模式打印值?
- 13. 如何使用awk或sed打印两行相邻的行?
- 14. 打印行中包含最少数量的组 - AWK/SED/PERL
- 15. 的grep/SED/AWK从表
- 16. EXPR/AWK/SED:从回购URL
- 17. 如何使用sed或awk打印段落的第一行和模式
- 18. 从xml使用sed打印文本值
- 19. AWK打印FNR从0开始递增
- 20. 打印匹配和不匹配的行; awk:打印匹配组
- 21. AWK和SED发现用线的基础上,从AWK
- 22. Sed和正则表达式仅打印
- 23. awk打印文件名和列
- 24. Unix awk模式匹配和打印行
- 25. AWK和打印命令输出
- 26. Tableau详细程度计算
- 27. Bash Array; Sed AWK
- 28. sed未打印到位
- 29. awk中:打印每一行
- 30. 卷曲AWK {}打印帮助
对我来说,原始命令中的-i在OS X上不起作用。是否缺少-e? – Paul 2012-12-04 10:24:10
评论由Paul:加工例如使用SED为OS X: '$回波你好>测试 $ SED -e 'S/LL/ZZ /;瓦特的/ dev /标准输出' -i测试的.backup hezzo $猫测试 hezzo $ cat test.backup hello' – StuartLC 2012-12-04 10:24:23
Paul:Mac OS X使用sed的BSD版本,它在某些方面与Linux系统中常见的GNU版本有所不同。对于BSD sed,您必须始终为-i指定* some *扩展名,而GNU sed不会将空字符串解释为空。所以BSD sed相当于GNU sed的'sed -i'只是'sed -i'''。 StuartLC的例子在任一版本上工作都一样,因为他没有就地编辑文件(即他使用的是非零长度的扩展名,所以不会遇到这个小差异)。 – robo 2013-12-19 16:37:29