為了猜測一些 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)
我想在文本行中獲取所有未找到的檔案/檔案夾的串列,我得到了它:
strace **DAN** 2>&1 | awk -v FS="," '/openat/ && /No existe/ {print substr($2, 3, length($2) - 3)} ' | sort | uniq -u | awk 'BEGIN{FS="/"; ORS=" "} {print $NF}'
其中DAN是桌面應用程式名稱,如“kate”、“libreoffice”或任何人。
注意:/不存在/就像/不存在/或/未找到/
我確信這個命令可以簡化,避免兩個“awk”命令,但不知道如何。我使用“排序”和“uniq”,因為我不想要重復的檔案名。
任何人都可以簡化這個?
先感謝您
uj5u.com熱心網友回復:
我有點喜歡你的實作,因為它很容易理解。完全在 awk(或本例中的 gawk)中執行此操作會變得有點混亂。就像是:
gawk -v FS="[,\"]" '/openat/ && /No existe/ {paths[gensub(/.*\//, "", 1, $3)]} END{PROCINFO["sorted_in"]="@ind_str_asc";for(path in paths){printf("%s ",path)};print}'
本質上,這只是將應用程式名稱轉儲到關聯陣列的鍵中。這允許我們進行重復資料洗掉,因為您不能擁有具有相同索引的兩個鍵。
一旦 strace 輸出被完全決議,我們告訴 gawk 使用它的鍵對陣列進行排序,按字串(按字典順序)和升序排序。
然后我們遍歷陣列并列印出鍵。
就像我說的,如果我將它寫成一個可支持的應用程式,我會支持你的實作。處理的步驟很清楚,沒有什么好玩的事情,比如借用關聯陣列鍵的去重來模仿你uniq的例子。
uj5u.com熱心網友回復:
假設您的檔案名不包含雙引號并且匹配行中唯一的雙引號在檔案名周圍,您可以使用雙引號作為欄位分隔符,返工$2并將結果用作關聯陣列的鍵(為了唯一性):
$ strace **DAN** 2>&1 | awk -F'"' '
/^openat.*No existe/ {sub(/(.*\/)?/,"",$2); f[$2]}
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/341203.html
