2016-12-18 144 views
1

我试图扭转检查IP地址的查询,然后将结果写入TXT文件。我如何使用grep将结果写入文件?打印输出到文件使用grep

我的脚本:

import sys, os, re, shlex, urllib, subprocess 

cmd = 'dig -x %s @192.1.1.1' % sys.argv[1] 

proc = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE) 
out, err = proc.communicate() 

sys.stdout = open("/tmp/test.txt", "w") 
print(out) 
sys.stdout.close() 
+0

'开放的( '的/ tmp /的test.txt', 'W')为f:f.write(出)' –

+0

哪里是这个问题的正则表达式的一部分? – DeepSpace

回答

0

评论 后编辑,以仅打印出包含字符串'PTR'一条线,第一输出分成的行的列表(各行是一个str),然后循环过线,并检查是否含有'PTR'

import sys, os, re, shlex, urllib, subprocess 

cmd = 'dig -x %s @192.1.1.1' % sys.argv[1] 

proc = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE) 
out, err = proc.communicate() 

# Convert to list of str lines 
out = out.decode().split('\n') 

# Only write the line containing "PTR" 
with open("/tmp/test.txt", "w") as f: 
    for line in out: 
     if "PTR" in line: 
      f.write(line) 

语法的进一步说明:本outproc.communicate()返回的对象不是str,而是bytes对象。 out.decode()执行从bytesstr的转换。然后我们使用.split('\n')将字符串分成几行。我们现在可以使用for循环遍历这些行,并询问"PTR"是否是任何行的子字符串。如果是,则将相应的行写入文件。请注意,如果多行包含"PTR",则它们将全部写入文件,而不会分隔换行符。

+0

'f.write(out)'更具语义。 –

+0

是的,但这更符合问题中的尝试。另外,不同于'f.write(out)','print(out,file = f)'不管'out'的类型如何(我认为这里'out'是'bytes'类型的) –

+0

嗨。无法理解你的答案 - 假设我得到了很多结果。但是我希望你只给包含单词“PTR”的行写文件。 我怎样才能得到它在我的脚本? – OmZ