我想在我的桌面上獲取一些 python 檔案,為此我撰寫了一個小腳本。但是 awk 命令沒有按預期作業。腳本
ls -l | awk '{ if($NF=="*.py") print $NF; }' | wc -l
我知道還有另一種解決方案可以在 PC 上查找大量 python 檔案,但我只想知道我在這里做錯了什么。
uj5u.com熱心網友回復:
ls -l | awk '{ if($NF=="*.py") print $NF; }' | wc -l
您的代碼確實計算了字面上命名的檔案*.py,您應該部署正則運算式匹配并使用正確的 GNUAWK語法,在修復它之后,您的代碼變為
ls -l | awk '{ if($NF~/[.]py$/) print $NF; }' | wc -l
注意[.]哪個表示文字 .并$表示字串的結尾。您的代碼可能會進一步改進,因為這里不需要使用if,因為 pattern-action 會這樣做
ls -l | awk '$NF~/[.]py$/{ print $NF; }' | wc -l
此外,您可以輕松地在 GNU 內部實作計數,AWK而不是wc -l如下部署
ls -l | awk '$NF~/[.]py$/{t =1}END{print t}'
在這里,對于每一個描述行,t都增加1一個,并且在處理完之后,就是在END它被print編輯了。t注意在 GNU 中不需要宣告變數AWK。
uj5u.com熱心網友回復:
不要嘗試決議 的輸出ls,請參閱https://mywiki.wooledge.org/ParsingLs。
除此之外,您的 awk 腳本失敗了,因為當您可能需要正則運算式比較時,您$NF=="*.py"正在對最后一個非空格字串進行文字字串部分比較,*.py例如,對于任何包含空格的檔案名$NF~/*.py$/,您print $NF將失敗。
如果您出于某種原因真的想在其中涉及 awk,那么假設 python 檔案串列不超過ARG_MAX,它將是:
awk 'BEGIN{print ARGC-1; exit}' *.py
但你可以在 bash 中做到這一點:
shopt -s nullglob
files=(*.py)
echo "${#files[@]}"
或者如果您出于某種原因想要使用管道,wc -l并且您的檔案的名稱中不能包含換行符,那么:
printf '%s\n' *.py | wc -l
uj5u.com熱心網友回復:
gfind . -maxdepth 1 -type f -name "*.py" -print0 |
{m,g}awk 'END { print NR }' RS='\0' FS='^$'
or
{m,g}awk 'END { print --NF }' RS='^$' FS='\0'
879
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/483477.html
