Bash

查找、grep 然後創建表

  • January 10, 2019

我試圖找到所有*.mdat ${PWD},然後 grep 以開頭的行title:並將其與絕對文件路徑-H和模式匹配的行號一起列印-n,然後我嘗試將結果輸出到帶有分隔符的表-s:

find ${PWD} -type f -name "*.md" -exec bash -c 'i="$1"; grep -HnE "^title:" $1; | column -t -s :;' _ {} \;

這一直工作到 grep 但我無法創建表。

此外,從@steeldriver 建議的更正中,exec 似乎find一個一個地發生在每個結果上,因此沒有創建表?


樣本輸出

/Admin/Specification/Specification.md    2  title   Specification
/Admin/GraphicCard/index.md              2  title   "GraphicCard"

你可能想多了。與其嘗試將結果製成表格grep,不如讓awk一位多產的製表師為您製作桌子?

find . -type f -name \*.md -print0 | xargs -0 awk 'BEGIN { OFS="\t" } /^title:/ { print FILENAME, FNR, $0 }'

find將找到md您感興趣的所有文件,並將它們作為參數傳遞awkxargs. 然後,我們只需awk在與您的標準匹配的行上吐出文件名(find將與完整的相對路徑一起傳遞),文件中的記錄號(即行號),以及如中所示的行文件; OFS全部由輸出欄位分隔符中定義的製表符分隔。

如果您想更精確地對齊輸出,您可以改為執行以下操作:

/^title:/ { printf( "%35s %4d %s\n", FILENAME, FNR, $0 ) }

此外,如果您不想find | xargs awk但更願意find -exec,這也有效:

find . -name \*.md -type f -exec awk '/expiry/ { printf( "%30s %4d %s\n", FILENAME, FNR, $0 ) }' "{}" +

引用自:https://unix.stackexchange.com/questions/493762