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

pyt*_*nic 1 c python regex linux notepad++

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

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

[a-zA-Z_](

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

Fre*_*Foo 7

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

<c_identifier>(
Run Code Online (Sandbox Code Playgroud)

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

syscalls = set(ln.split('(', 1)[0] for ln in strace_output)
Run Code Online (Sandbox Code Playgroud)

(你可以在一行Awk中完成这项工作,如果你宁愿在shell中工作而不是在Python中工作.)

  • @ user1018562实际上 - 即使它包含在编辑器中,在strace的文字输出中也不应该有换行符,所以这个解决方案应该正常工作. (2认同)

Den*_*nis 5

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

在正则表达式中,括号有特殊含义,所以你必须对它们进行转义:

[a-zA-Z_]\(
Run Code Online (Sandbox Code Playgroud)

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

要匹配整个blah(,请使用

[a-zA-Z_]+\(
Run Code Online (Sandbox Code Playgroud)