从python子进程运行linux grep命令

时间:2015-09-22 08:31:39

标签: python linux grep subprocess

我知道有关于如何在python中使用子进程来运行linux命令的帖子,但我不能让这个语法正确。请帮忙。这是我需要运行的命令......

+"question": b"Rivets – correct colour and number"

好的,这就是我现在所提出的语法错误......

/sbin/ifconfig eth1 | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

以下是如何使用Python构建管道(而不是恢复为Shell=True,这更难以保护)。

from subprocess import PIPE, Popen

# Do `which` to get correct paths
GREP_PATH = '/usr/bin/grep'
IFCONFIG_PATH = '/usr/bin/ifconfig'
AWK_PATH = '/usr/bin/awk'

awk2 = Popen([AWK_PATH, '{print $1}'], stdin=PIPE)
awk1 = Popen([AWK_PATH, '-F:', '{print $2}'], stdin=PIPE, stdout=awk2.stdin)
grep = Popen([GREP_PATH, 'inet addr'], stdin=PIPE, stdout=awk1.stdin)
ifconfig = Popen([IFCONFIG_PATH, 'eth1'], stdout=grep.stdin)

procs = [ifconfig, grep, awk1, awk2]

for proc in procs:
    print(proc)
    proc.wait()

使用re在Python中进行字符串处理会更好。这样做是为了获得ifconfig的标准输出。

from subprocess import check_output

stdout = check_output(['/usr/bin/ifconfig', 'eth1'])
print(stdout)

答案 1 :(得分:0)

之前已经过去很多次了;但是这里是一个简单的纯Python替换,用于低效的后处理。

from subprocess import Popen, PIPE
eth1 = subprocess.Popen(['/sbin/ifconfig', 'eth1'], stdout=PIPE)
out, err = eth1.communicate()
for line in out.split('\n'):
    line = line.lstrip()
    if line.startswith('inet addr:'):
        ip = line.split()[1][5:]