是否可以简化这个多个 linux 命令脚本(也许是 awk 命令)?
Is possible to simplify this multiple linux command script (maybe awk commands)?
为了猜测一些 KDE 应用程序会做一些奇怪的事情,我创建了一个单行命令来列出桌面应用程序刚启动和关闭时未找到的所有文件。
我使用 strace
输出作为要处理的数据源,如下所示:
openat(AT_FDCWD, "/usr/share/nvidia/nvidia-application-profiles-rc", O_RDONLY) = -1 ENOENT (No existe el fichero o el directorio)
openat(AT_FDCWD, "/usr/X11R6/lib/X11/fonts/.uuid", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No existe el fichero o el directorio)
openat(AT_FDCWD, "/var/cache/fontconfig/0bcde688-f6c6-45d7-9a5c-9a93ce4e186f-x86_64.cache-7", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No existe el fichero o el directorio)
openat(AT_FDCWD, "/usr/lib64/qt5/plugins/platformthemes/KDEPlasmaPlatformTheme.so.avx2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No existe el fichero o el directorio)
openat(AT_FDCWD, "/etc/nvidia/nvidia-application-profiles-rc", O_RDONLY) = -1 ENOENT (No existe el fichero o el directorio)
我想在文本行中获取所有未找到的列表 files/folders,我通过以下方式获得了它:
strace **DAN** 2>&1 | awk -v FS="," '/openat/ && /No existe/ {print substr(, 3, length() - 3)} ' | sort | uniq -u | awk 'BEGIN{FS="/"; ORS=" "} {print $NF}'
其中 DAN 是桌面应用程序名称,如“kate”、“libreoffice”或任何人。
注意:/不存在/就像/不存在/或/未找到/
我确定可以简化此命令,避免使用两个“awk”命令,但不知道如何简化。我使用“sort”和“uniq”因为我不想重复文件名。
谁能简化一下?
提前致谢
我有点喜欢你的实现,因为它很容易理解。完全在 awk(或本例中的 gawk)中执行此操作会变得有点混乱。类似于:
gawk -v FS="[,\"]" '/openat/ && /No existe/ {paths[gensub(/.*\//, "", 1, )]} END{PROCINFO["sorted_in"]="@ind_str_asc";for(path in paths){printf("%s ",path)};print}'
本质上,这只是将应用程序名称转储到关联数组的键中。这允许我们去重,因为你不能有两个具有相同索引的键。
一旦 strace 输出被完全解析,我们告诉 gawk 使用它的键对数组进行排序,按字符串排序(按字典顺序),并按升序排序。
然后我们遍历数组并打印出键。
正如我所说,如果我将其编写为可支持的应用程序,我会选择您的实现。处理过程中的步骤很清楚,没有任何有趣的事情,比如借用关联数组键的重复数据删除来模仿你的uniq
作为例子。
假设您的文件名不包含双引号并且匹配行中唯一的双引号是在文件名周围,您可以使用双引号作为字段分隔符,重做 </code> 并将结果用作关联数组的键(唯一性):</p>
<pre><code>$ strace **DAN** 2>&1 | awk -F'"' '
/^openat.*No existe/ {sub(/(.*\/)?/,"",); f[]}
END {for(k in f) printf("%s ", k); print}'
.uuid 0bcde688-f6c6-45d7-9a5c-9a93ce4e186f-x86_64.cache-7 nvidia-application-profiles-rc KDEPlasmaPlatformTheme.so.avx2
为了猜测一些 KDE 应用程序会做一些奇怪的事情,我创建了一个单行命令来列出桌面应用程序刚启动和关闭时未找到的所有文件。
我使用 strace
输出作为要处理的数据源,如下所示:
openat(AT_FDCWD, "/usr/share/nvidia/nvidia-application-profiles-rc", O_RDONLY) = -1 ENOENT (No existe el fichero o el directorio)
openat(AT_FDCWD, "/usr/X11R6/lib/X11/fonts/.uuid", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No existe el fichero o el directorio)
openat(AT_FDCWD, "/var/cache/fontconfig/0bcde688-f6c6-45d7-9a5c-9a93ce4e186f-x86_64.cache-7", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No existe el fichero o el directorio)
openat(AT_FDCWD, "/usr/lib64/qt5/plugins/platformthemes/KDEPlasmaPlatformTheme.so.avx2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No existe el fichero o el directorio)
openat(AT_FDCWD, "/etc/nvidia/nvidia-application-profiles-rc", O_RDONLY) = -1 ENOENT (No existe el fichero o el directorio)
我想在文本行中获取所有未找到的列表 files/folders,我通过以下方式获得了它:
strace **DAN** 2>&1 | awk -v FS="," '/openat/ && /No existe/ {print substr(, 3, length() - 3)} ' | sort | uniq -u | awk 'BEGIN{FS="/"; ORS=" "} {print $NF}'
其中 DAN 是桌面应用程序名称,如“kate”、“libreoffice”或任何人。
注意:/不存在/就像/不存在/或/未找到/
我确定可以简化此命令,避免使用两个“awk”命令,但不知道如何简化。我使用“sort”和“uniq”因为我不想重复文件名。
谁能简化一下?
提前致谢
我有点喜欢你的实现,因为它很容易理解。完全在 awk(或本例中的 gawk)中执行此操作会变得有点混乱。类似于:
gawk -v FS="[,\"]" '/openat/ && /No existe/ {paths[gensub(/.*\//, "", 1, )]} END{PROCINFO["sorted_in"]="@ind_str_asc";for(path in paths){printf("%s ",path)};print}'
本质上,这只是将应用程序名称转储到关联数组的键中。这允许我们去重,因为你不能有两个具有相同索引的键。
一旦 strace 输出被完全解析,我们告诉 gawk 使用它的键对数组进行排序,按字符串排序(按字典顺序),并按升序排序。
然后我们遍历数组并打印出键。
正如我所说,如果我将其编写为可支持的应用程序,我会选择您的实现。处理过程中的步骤很清楚,没有任何有趣的事情,比如借用关联数组键的重复数据删除来模仿你的uniq
作为例子。
假设您的文件名不包含双引号并且匹配行中唯一的双引号是在文件名周围,您可以使用双引号作为字段分隔符,重做 </code> 并将结果用作关联数组的键(唯一性):</p>
<pre><code>$ strace **DAN** 2>&1 | awk -F'"' '
/^openat.*No existe/ {sub(/(.*\/)?/,"",); f[]}
END {for(k in f) printf("%s ", k); print}'
.uuid 0bcde688-f6c6-45d7-9a5c-9a93ce4e186f-x86_64.cache-7 nvidia-application-profiles-rc KDEPlasmaPlatformTheme.so.avx2