watch命令组合管道执行异常:awk未生效,如何解决?
问题解决:watch命令中awk未正确提取ls输出的文件大小
你的问题出在shell对引号内变量的解析顺序上:原命令里的$5被当前shell提前解析了,没有传给awk,导致awk执行的是无参数的print(默认打印整行)。
修复方案1:转义$符号
把$5改成\$5,让shell不解析这个变量,完整传递给awk:
watch -n 0.25 --color "unbuffer iostat -h && ls -lAh ./backup.tar.gz | awk '{ print \$5 }'"
修复方案2:调整引号嵌套逻辑
用单引号包裹整个watch的命令字符串,内部的awk脚本改用双引号(或者转义内部单引号):
# 用双引号包裹awk脚本 watch -n 0.25 --color 'unbuffer iostat -h && ls -lAh ./backup.tar.gz | awk "{ print \$5 }"' # 转义内部单引号的写法 watch -n 0.25 --color 'unbuffer iostat -h && ls -lAh ./backup.tar.gz | awk '\''{ print $5 }'\'
更可靠的替代方案(推荐)
ls的列格式可能因系统locale、配置变化而改变,用stat直接获取文件大小更稳定:
# 获取字节数 watch -n 0.25 --color "unbuffer iostat -h && stat -c %s ./backup.tar.gz" # 获取人类可读格式的大小(比如2.7G) watch -n 0.25 --color "unbuffer iostat -h && stat -c %s ./backup.tar.gz | numfmt --to=iec"
内容的提问来源于stack exchange,提问作者Dominik
相关产品推荐
相关产品推荐

