You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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.call vs subprocess.run:call仅返回命令的退出码,如果你需要捕获命令的输出,一定要用run搭配capture_output=True或stdout=subprocess.PIPE。
  • 命令替换的误区:$(...)在shell中是用来获取命令输出的,但如果你把它直接作为subprocess的命令参数,shell会把输出当成新命令执行,这不是你想要的。
  • shell=True的利弊:启用shell=True可以直接用管道、通配符等shell特性,但存在shell注入的风险;禁用时需要把命令拆分成列表,更安全但写法稍繁琐。

内容的提问来源于stack exchange,提问作者mona

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:39:11