使用 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
,全部处理完后,即END
是print
。观察在 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
我想在我的桌面上获取一些 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
,全部处理完后,即END
是print
。观察在 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