2012-03-23 70 views

回答

4

如果你的sedawk输出重定向到一个文件中(而不是就地修改文件),你可以给pv(“管子观众”)一拍:

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

您可以使用pv -l以使其报告书面进度。进度状态打印到stderr,而实际数据从stdinstdout

4

您可以随时告诉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 

我希望这有助于。

5

这可能会为你(对SED)工作:

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

对我来说,原始命令中的-i在OS X上不起作用。是否缺少-e? – Paul 2012-12-04 10:24:10

+0

评论由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

+1

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

3

如果你是在Linux上,你可以通过观察/proc/<pid>/fdinfo查看进程,正在处理大量文件的进度。每个打开的文件描述符都有一个入口,如果你捕获这些入口,它们将显示文件描述符的读/写位置。所以你可以看到你是1123456字节的文件。打开文件的路径名称位于另一个区域:/proc/<pid>/fd,表示为符号链接。

在我看之前,我通常附加一个strace进程:strace -p <pid>。您可以使用它来查看进程正在进行的系统调用:文件读取和写入以及使用brkmmap进行的内存分配。

+0

为了方便起见:'ps ax | grep foo',其中'foo'是相关程序的名称,可用于查找以上使用的进程标识。 – 2017-10-28 02:36:56

5

假设您将sed输出管道输出到文件,您可以使用tail命令(在另一个终端中)不断查看文件末尾;这样你就可以看到进展。

tail -f output_from_sed.txt 
2

这可能不是你正在寻找的东西,但它可能会帮助别人。 FWIW:
gawk -W dump-variables=/tmp/awk.log
会将脚本末尾的变量值转储到日志文件中。

7

这是基于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 
+2

在较新的sed版本中,如果忽略w之前的分号,则w将成为“s”sed命令的参数,并且只有更改写入到/ dev/stdout,这对我来说比编写整个文件更有用 – Jack 2017-01-31 19:41:12

0

“正确”的答案这里是

pv myfile.txt | sed ... 

爱德华伊万内茨的回答很接近,但通过使用管道查看器(PV)做实际的管道,你了解你的进步是什么(如百分比,包括像M/sec这样的高统计数据,总数据等)。

pv作品像cat(读取该文件,并直接导出为stdout,或者在管道中的情况下,它的stdinstdout之间的桥梁)。

重要的是,由于pv是一个“透明管道进程”,stdout被中继数据占用。所以进度报告通过stderr报告。

+0

请注意,这不适用于就地替换...(AFAIK) – starryknight64 2017-06-13 21:16:59