使用 bash 和 awk 计算 Python 个文件总是 returns 零

Counting Python files with bash and awk always returns zero

我想在我的桌面上获取一些 python 文件,我为此编写了一个小脚本。但是 awk 命令没有像预期的那样工作。 脚本

ls -l | awk '{ if($NF=="*.py") print $NF; }' | wc -l

我知道还有另一种解决方案可以在 PC 上查找多个 python 文件,但我只想知道我在这里做错了什么。

ls -l | awk '{ if($NF=="*.py") print $NF; }' | wc -l

你的代码确实计算了 字面上 名为 *.py 的文件,你应该部署正则表达式匹配并使用正确的 GNU AWK 语法,在修复之后,你的代码变为

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,全部处理完后,即ENDprint。观察在 GNU AWK.

中不需要声明 t 变量

不要尝试解析 ls 的输出,请参阅 https://mywiki.wooledge.org/ParsingLs

除此之外,您的 awk 脚本失败了,因为 $NF=="*.py" 正在对 non-spaces 的最后一个字符串与 *.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
gfind . -maxdepth 1 -type f -name "*.py" -print0 | 

     {m,g}awk 'END { print   NR }' RS='[=10=]' FS='^$'
   or
     {m,g}awk 'END { print --NF }' RS='^$' FS='[=10=]'

879