【问题标题】:How to execute awk command inside python如何在python中执行awk命令
【发布时间】:2017-12-04 09:13:10
【问题描述】:

我正在尝试在 python 中运行以下 awk 命令,但出现与引号相关的语法错误:

import subprocess
COMMAND = "df /dev/sda1 | awk /'NR==2 {sub("%","",$5); if ($5 >= 80) {printf "Warning! Space usage is %d%%", $5}}"

subprocess.call(COMMAND, shell=True)

我试图转义引号,但仍然遇到同样的错误。

【问题讨论】:

  • 正确的转义应该是这样的:COMMAND = "df /dev/sda1 | awk 'NR==2 {sub(\"%\",\"\",$5); if ($5 >= 80) {printf \"Warning! Space usage is %d%%\", $5}}'"
  • 你有一个未封闭的报价。我建议您在实际使用 python 之前在终端中运行它。
  • COMMAND 字符串上使用三引号。但是你为什么要这样做呢?只需使用 awk,或仅使用 Python。两者都用有什么意义?

标签: python awk


【解决方案1】:

您可能需要在字符串周围加上'''""",因为您同时拥有'"

import subprocess
COMMAND = '''"df /dev/sda1 | awk /'NR==2 {sub("%","",$5); if ($5 >= 80) {printf "Warning! Space usage is %d%%", $5}}"'''

subprocess.call(COMMAND, shell=True)

似乎也有一个相关的答案:awk commands within python script

【讨论】:

  • 在这种情况下,我得到:没有这样的文件或目录
  • 这可能是df 命令的输出。 df 应该用于文件系统而不是磁盘。
【解决方案2】:

试试这个:

import subprocess
COMMAND="df /dev/sda1 | awk 'NR==2 {sub(\"%\",\"\",$5); if ($5 >= 80) {printf \"Warning! Space usage is %d%%\", $5}}'"

subprocess.Popen(COMMAND,stdin=subprocess.PIPE,stdout=subprocess.PIPE, shell=True).stdout.read()

【讨论】:

  • shell=True 不推荐
【解决方案3】:

我正在为我的部署目的编写一个 python 脚本,脚本的一部分是在进程未成功停止时显式终止该进程。

下面是实际执行的python代码 找到名为 myApplication 的进程的 processId ps -ef | grep myApplication | grep -v grep | awk {'print $2'} 然后执行 kill -9 PID //其中 PID 是先前命令的输出

  import subprocess
  import signal

  def killApplicationProcessIfStillRunning(app_name):
      p1 = subprocess.Popen(['ps', '-ef'], stdout=subprocess.PIPE)
      p2 = subprocess.Popen(['grep', app_name],stdin=p1.stdout, stdout=subprocess.PIPE)
      p3 = subprocess.Popen(['grep', '-v' , 'grep'],stdin=p2.stdout, stdout=subprocess.PIPE)
      p4 = subprocess.Popen(['awk', '{print $2}'],stdin=p3.stdout, stdout=subprocess.PIPE)
      out, err = p4.communicate()
      if out:
          print 'Attempting to kill '+app_name +' process with PID ' +out.splitlines()[0]
          os.kill(int(out.splitlines()[0]),signal.SIGKILL)

现在调用上述方法

killApplicationProcessIfStillRunning(myApplication)

希望对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 2018-10-04
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多