1

我有一个由strace生成的文件,其中包含所有系统调用。现在我想获取所有系统调用的名称。因此,如果我mprotect列出了 4 次,我只需要列出 1 次,即我只需要列出唯一的系统调用。

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

[a-zA-Z_](

但记事本什么也没找到。您认为正确的正则表达式是什么?

4

3 回答 3

7

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

<c_identifier>(

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

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

(如果您宁愿在 shell 中工作而不是在 Python 中工作,也可以在一行 Awk 中执行此操作。)

于 2012-05-14T13:58:01.913 回答
5

Notepad++ 应该告诉你无效的正则表达式。最新版本可以。

在正则表达式中,括号具有特殊含义,因此您必须对其进行转义:

[a-zA-Z_]\(

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

要匹配整个blah(,请使用

[a-zA-Z_]+\(
于 2012-05-14T13:57:46.437 回答
2

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

于 2012-05-14T13:57:59.553 回答