Bash
查找、grep 然後創建表
我試圖找到所有
*.md
at${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
您感興趣的所有文件,並將它們作為參數傳遞awk
給xargs
. 然後,我們只需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 ) }' "{}" +