如何简化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
逻辑说明
- 匹配规则和原有逻辑完全一致,仅处理
openat系统调用且返回文件不存在的行 - 提取路径后直接用正则替换去掉路径前缀,一次性拿到文件名,无需二次调用awk
- 用关联数组
seen记录已经出现过的文件名,实现原生去重,不需要额外管道调用sort/uniq - 输出默认使用空格作为分隔符,直接生成一行文本的结果
内容的提问来源于stack exchange,提问作者Rafael Linux User
相关产品推荐
相关产品推荐

