如何在Python中使用awk命令?调用awk获取Linux磁盘空间报错
解决Python调用awk查询磁盘空间的错误问题
我来帮你分析并解决这个问题,先拆解你遇到的错误原因,再给出正确的实现方式。
为什么会出现/bin/sh: 1: 4.7G: not found错误?
你当前的代码:
import subprocess subprocess.call("$(awk 'NR==2 {print $4}' file1.txt)")
核心问题是你把awk命令的输出当成了要执行的命令。当shell=True(subprocess.call传入字符串时默认启用shell解析),shell会先执行$(awk ...)做命令替换,得到4.7G这个结果,然后尝试去执行4.7G这个“命令”——但显然这不是一个合法的shell命令,所以抛出“not found”错误,退出码127正是shell表示“命令未找到”的标准返回值。
另外,你的目标是查询/var/tmp的可用空间,其实不需要先把df的输出存到file1.txt里,直接用管道命令更高效。
Python中正确调用awk的两种方式
方式1:使用shell=True(简单直观,适合快速实现)
如果你想直接复用shell管道命令,可以把整个命令作为字符串传递给subprocess,同时用run方法捕获输出(而不是call,因为call只返回退出码,不捕获输出):
import subprocess try: # 执行df + awk的管道命令,捕获输出 result = subprocess.run( "df -h /var/tmp | awk 'NR==2 {print $4}'", shell=True, check=True, # 如果命令执行失败会抛出异常 capture_output=True, text=True # 把输出转成字符串,而不是字节流 ) # 去除输出中的换行符和空格 available_space = result.stdout.strip() print(f"/var/tmp的可用空间是:{available_space}") except subprocess.CalledProcessError as e: print(f"命令执行失败:{e.stderr.strip()}")
方式2:不使用shell=True(更安全,避免shell注入风险)
如果追求更高的安全性(比如处理用户输入的路径时),可以把每个命令拆分成列表,通过管道传递输入:
import subprocess try: # 第一步:执行df命令获取/var/tmp的磁盘信息 df_result = subprocess.run( ["df", "-h", "/var/tmp"], capture_output=True, text=True, check=True ) # 第二步:把df的输出作为输入传给awk命令 awk_result = subprocess.run( ["awk", "NR==2 {print $4}"], input=df_result.stdout, capture_output=True, text=True, check=True ) available_space = awk_result.stdout.strip() print(f"/var/tmp的可用空间是:{available_space}") except subprocess.CalledProcessError as e: print(f"命令执行失败:{e.stderr.strip()}")
关键知识点总结
subprocess.callvssubprocess.run:call仅返回命令的退出码,如果你需要捕获命令的输出,一定要用run搭配capture_output=True或stdout=subprocess.PIPE。- 命令替换的误区:
$(...)在shell中是用来获取命令输出的,但如果你把它直接作为subprocess的命令参数,shell会把输出当成新命令执行,这不是你想要的。 - shell=True的利弊:启用shell=True可以直接用管道、通配符等shell特性,但存在shell注入的风险;禁用时需要把命令拆分成列表,更安全但写法稍繁琐。
内容的提问来源于stack exchange,提问作者mona
相关产品推荐
相关产品推荐

