在`find ... -exec bash -c`中使用awk统计文件总数的引号问题
解决单引号嵌套导致的bash命令解析问题
你遇到的核心问题是单引号嵌套冲突:外层bash -c用单引号包裹执行脚本,里面awk的脚本又想用单引号避免$1被bash扩展,这就导致bash无法正确识别引号边界,进而出现等待输入的情况。下面给你三种可行的解决方法:
方法1:用双引号包裹awk脚本并转义$
把awk的脚本用双引号包裹,同时将awk里的$1转义为\$1,防止bash把它当成自身的位置参数替换:
find . -name "failures.count" -exec bash -c 'echo -n "$1: "; awk "{n+=\$1} END {print n}" "$1"' bash {} \;
注意给$1加上双引号,避免文件名包含空格时出现解析错误。
方法2:在单引号字符串中插入单引号的技巧
bash中可以用'\''来在单引号包裹的字符串里插入单引号(原理是:先关闭当前单引号,用转义单引号表示一个单引号字符,再重新打开单引号),这样就能让awk脚本保持单引号包裹:
find . -name "failures.count" -exec bash -c 'echo -n "$1: "; awk '\''{n+=$1} END {print n}'\'' "$1"' bash {} \;
这种方式下awk的$1会被原样传递,不会被bash扩展。
方法3:直接用awk处理(更简洁)
跳过bash -c的嵌套,直接用awk的变量传递文件名,避免引号问题:
find . -name "failures.count" -exec awk -v fname="{}" '{n+=$1} END {print fname ":", n}' {} \;
这里用-v fname="{}"把find找到的文件名传给awk的变量fname,最后在END块里输出文件名和累加结果。
内容的提问来源于stack exchange,提问作者Pacopenguin
相关产品推荐
相关产品推荐

