You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化Linux下用awk处理strace输出提取缺失文件的多命令脚本

简化后的命令方案

完全可以把所有逻辑整合到单次awk调用中,甚至可以用awk内置的关联数组实现去重,省去单独调用sort和uniq的步骤,最终简化命令如下:

无需额外排序的最简版本

strace DAN 2>&1 | awk '
BEGIN { FS=","; ORS=" " }
/openat/ && /No existe/ {
    path = substr($2, 3, length($2)-3)
    sub(/.*\//, "", path)
    if (!seen[path]++) print path
}
'

将命令中的DAN替换为你要监控的应用名(如kate、libreoffice)即可运行。

带文件名排序的版本

如果你需要输出的文件名按字典序排序,可以使用如下版本:

strace DAN 2>&1 | awk '
BEGIN { FS="," }
/openat/ && /No existe/ {
    path = substr($2, 3, length($2)-3)
    sub(/.*\//, "", path)
    seen[path]++
}
END {
    n = asorti(seen, sorted_names)
    for (i=1; i<=n; i++) printf "%s ", sorted_names[i]
}
'

如果你的环境使用mawk(部分Debian/Ubuntu默认awk为mawk,不支持asorti),可以用如下轻量版本实现排序输出:

strace DAN 2>&1 | awk '
BEGIN { FS="," }
/openat/ && /No existe/ {
    path = substr($2, 3, length($2)-3)
    sub(/.*\//, "", path)
    if (!seen[path]++) print path
}
' | sort | xargs

逻辑说明

  1. 匹配规则和原有逻辑完全一致,仅处理openat系统调用且返回文件不存在的行
  2. 提取路径后直接用正则替换去掉路径前缀,一次性拿到文件名,无需二次调用awk
  3. 用关联数组seen记录已经出现过的文件名,实现原生去重,不需要额外管道调用sort/uniq
  4. 输出默认使用空格作为分隔符,直接生成一行文本的结果

内容的提问来源于stack exchange,提问作者Rafael Linux User

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 22:27:05