从strace输出中提取唯一的系统调用名称(通过正则表达式?)

时间:2012-05-14 13:53:12

标签: python c regex linux notepad++

我有strace生成的文件,其中包含所有系统调用。现在我想得到所有系统调用的名称。因此,如果我列出了mprotect 4次,我只需要列出一次,也就是说我只需要列出唯一的系统调用。

我想到的一种方法是使用python或支持解析正则表达式的任何其他语言的正则表达式来首先查看所有系统调用,然后消除重复项。为此,我首先尝试使用notepad ++的搜索功能测试我的正则表达式。我希望匹配这样的任何内容,blah(。为此,我设计了以下正则表达式

[a-zA-Z_](

但是记事本一无所获。您认为正确的正则表达式是什么?

3 个答案:

答案 0 :(得分:7)

为什么你认为你需要正则表达式? strace的输出是一系列行,每行以

开头
<c_identifier>(

和C标识符不能包含(,因此您可以将部分提取到(以获取系统调用的名称。在Python中,这个单行计算一组不同的系统调用:

syscalls = set(ln.split('(', 1)[0] for ln in strace_output)

(你可以在一行Awk中做到这一点,如果你宁愿在shell中工作而不是在Python中工作。)

答案 1 :(得分:4)

Notepad ++应该告诉你无效的正则表达式。最新版本确实如此。

在正则表达式中,括号具有特殊含义,因此您必须转义它们:

[a-zA-Z_]\(

会在h(中找到blah(,因为括号中的部分未量化(如@CharlesDuffy指出的那样)。

要匹配整个blah(,请使用

[a-zA-Z_]+\(

答案 2 :(得分:2)

应该是[a-zA-Z_]+\(。这是因为圆括号用作元字符。