从strace输出中提取系统调用名称

时间:2018-11-19 07:58:51

标签: linux bash grep strace lookahead

我使用以下命令从strace输出中提取系统调用名称:

strace ls 3>&1 1>&2 2>&3 3>&- | grep -P -o '^[a-z]*(?=\()'

,但是此命令在输出中还包含 ls输出。 我该如何预防?

2 个答案:

答案 0 :(得分:1)

strace有两个选项,可帮助您获得所需的内容:

  • -c将输出该命令运行的所有系统调用的表,以及它们被调用的次数和CPU使用率。
$ strace -c ls
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 31.07    0.000653          20        32           mmap
  9.94    0.000209          20        10           mprotect
  9.80    0.000206          12        16           read
  8.28    0.000174          15        11           close
  7.61    0.000160          16        10           fstat
  6.90    0.000145          16         9           openat
  2.47    0.000052          17         3         3 ioctl
...
  • -o选项会将strace的输出发送到文件,因此不会与进程的输出混在一起。

以下将运行ls命令,将其输出转移到/dev/null,并将strace的输出发送到awk脚本以提取最后一列:

$ strace -o >(awk '$1 ~ /^-----/ { toprint = !toprint; next } { if (toprint) print $NF }') \
  -c ls >/dev/null 2>/dev/null
mmap
mprotect
read
close
fstat
openat
ioctl
...

答案 1 :(得分:0)

最后,我借助以下链接找到了一种解决方案:http://mywiki.wooledge.org/BashFAQ/047

app.html

和一个有用的变种来计算系统调用:

<require from="http://cdn.syncfusion.com/js/assets/external/jquery-1.10.2.min.js"></require> <require from="http://cdn.syncfusion.com/js/assets/external/jsrender.min.js"></require> <require from="http://cdn.syncfusion.com/16.3.0.29/js/web/ej.web.all.min.js"></require>

以及使用 Mark Plotnick 的答案的更好解决方案:

strace ls 2>&1 >/dev/null | grep -P -o '^[a-z]*(?=\()'