我正在使用" strace -f -T -tt -o foo.txt -p 1234"打印系统调用所花费的时间。这使输出文件变得庞大,有没有办法只打印超过1秒的系统调用。我可以稍后从文件中删除它,但是有更好的方法吗?
答案 0 :(得分:0)
如果我们只是省略-o foo.txt
参数,则输出转到标准输出。我们可以通过grep管道并重定向到文件:
strace -f -T -tt -p 1234 | grep pattern > foo.txt
同时观看输出:
strace -f -T -tt -p 1234 | grep pattern | tee foo.txt
如果命令仅打印到作为参数传递的文件,并且我们想要过滤/重定向其输出,则第一步是检查它是否实现了破折号约定:是否可以使用{指定标准输入或输出{1}}作为文件名参数:
-
如果没有,那么求助于使用Bash流程替换替换语法:some_command - | our_pipe > file.txt
和>(output command)
:
<(input command)
进程替换语法扩展为适合作为命令或函数的文件名参数的标记。当程序打开该标记时,它会根据方向获取命令输入或输出的文件描述符。
通过进程替换,我们可以重定向顽固程序的输入或输出,这些程序仅对作为参数传递的文件起作用,并且不支持请求使用标准输入或输出代替文件的任何约定
进程替换使用的令牌与平台有关;我们可以看到使用some_command >(our_pipe > file.txt)
的内容。例如,在GNU / Linux上,Bash利用echo
操作系统功能:
/dev/fd
答案 1 :(得分:0)
您可以使用以下命令:
strace -T command 2>&1 >/dev/null | awk '{gsub(/[<>]/,"",$NF)}$NF+.0>1.0'
说明:
strace -T
在<...>
2>&1 >/dev/null | awk
将stderr传递给awk
。 (strace
将其输出写入stderr!)awk
命令从最后一个字段<>
中删除$NF
,并打印花费时间超过一秒的行。您可能还希望将阈值作为变量传递给awk命令:
strace -T command 2>&1 >/dev/null \
| awk -v thres=0.001 '{gsub(/[<>]/,"",$NF)}$NF+.0>thres+.0'