我只是在学习Python,但在PERL和PHP方面有大约16年的经验。
我试图获取ngrep的输出并使用Python将其写入日志文件,同时还会拖尾日志文件。我在网上看到了一些例子,但有些看起来过时而且过时了,其他人则使用shell = True,这是不鼓励的。
在perl中,我只使用类似于以下内容的内容
#!/usr/bin/perl
open(NGFH,"ngrep -iW byline $filter");
while ($line = <NGFH>) {
open(LOG,">> /path/to/file.log")
// highlighting, filtering, other sub routine calls
print LOG $line
}
我已经开始工作,但ngrep并没有。我希望能够无限运行并在过滤后将流从ngrep输出到日志文件。我无法从ngrep获得输出,以便在stdout中显示,以便我能够获得。我希望能够在更新日志文件时看到数据文件尾部,并查看ngrep的输出。现在我只是使用bash运行以下内容。
echo "." >> /path/to/ngrep.log
谢谢!
这是我到目前为止所得到的......
更新 这似乎现在有效。我不知道如何改进它。
import subprocess
import select
import re
log = open('/path/to/ngrep.log','a+',0)
print log.name
n = subprocess.Popen(['ngrep', '-iW', 'byline'],\
stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
p = select.poll()
p.register(n.stdout)
f = subprocess.Popen(['tail','-F','-n','0','/path/to/tailme.log'],\
stdout=subprocess.PIPE,stderr=subprocess.PIPE)
p2 = select.poll()
p2.register(f.stdout)
def srtrepl(match):
if match.group(0) == 'x.x.x.x':
# do something
if match.group(0) == 'x.x.y.y':
# do something else
return '\033[92m'+ match.group(0) + '\033[0m'
while True:
if p.poll(1):
line = n.stdout.readline()
s = re.compile(r'(8.8.(4.4|8.8)|192.168.[0-9]{1,3}.[0-9]{1,3})' )
print s.sub( srtrepl, line )
log.write(n.stdout.readline())
if p2.poll(1):
print f.stdout.readline().rstrip('\n')
答案 0 :(得分:1)
在Python中模拟你的perl代码:
#!/usr/bin/env python3
from subprocess import Popen, PIPE
with Popen("ngrep -iW byline".split() + [filter_], stdout=PIPE) as process, \
open('/path/to/file.log', 'ab') as log_file:
for line in process.stdout: # read b'\n'-separated lines
# highlighting, filtering, other function calls
log_file.write(line)
它启动ngrep
进程传递filter_
变量并将输出附加到日志文件,同时允许您在Python中修改它。请参阅Python: read streaming input from subprocess.communicate()(可能存在缓冲问题:检查ngrep
是否支持--line-buffered
grep
选项,如果您想要file.log
,请pass buffering=1
to open()
, to enable line-buffering (only usable in the text-mode)或在log_file.flush()
之后致电log_file.write(line)
。
你也可以在纯Python中模仿ngrep
。
如果您想要同时读取多个进程的输出(ngrep
,tail
),那么您需要能够read pipes without blocking e.g., using threads, async.io。