我希望运行Linux实用程序wc来确定/var/log/syslog中当前的行数,这样我就可以检测到它在增长。我尝试过各种测试,在从wc获得结果的同时,它还包括行计数和命令(例如var/log/syslog)。
所以它返回: 1338 /var/log/syslog,但我只想要行数,所以我想去掉/var/log/syslog部分,只保留1338。
我试过把它从字节串转换成字符串,然后去掉结果,但没有joy。同样的故事,转换为字符串和剥离,解码等-都无法产生输出,我正在寻找。
下面是我得到的一些例子,在syslog中有1338行:
下面是我编写的一些测试代码,试图破解这个难题,但没有解决方案:
import subprocess
#check_output returns byte string
stdoutdata = subprocess.check_output("wc --lines /var/log/syslog", shell=True)
print("2A stdoutdata: " + str(stdoutdata))
stdoutdata = stdoutdata.decode("utf-8")
print("2B stdoutdata: " + str(stdoutdata))
stdoutdata=stdoutdata.strip()
print("2C stdoutdata: " + str(stdoutdata)) 它的输出是:
发布于 2013-08-15 00:27:39
发布于 2018-09-13 11:23:54
由于Python3.6可以使check_output()返回一个str而不是bytes,方法是给它一个编码参数:
check_output('wc --lines /var/log/syslog', encoding='UTF-8')但是,由于您只需要计数,而且split()和int()都可以用于bytes,所以您不需要费心编码:
linecount = int(check_output('wc -l /var/log/syslog').split()[0])虽然使用外部程序可能更容易(例如,计算由journalctl打印的日志行条目),但在这种特殊情况下,您不需要使用外部程序。最简单的Python解决方案是:
with open('/var/log/syslog', 'rt') as f:
linecount = len(f.readlines())这样做的缺点是,它会将整个文件读入内存;如果它是一个巨大的文件,那么在打开文件之前初始化linecount = 0,然后使用for line in f: linecount += 1循环而不是readlines(),以便在计算时将文件的一小部分保存在内存中。
发布于 2013-08-16 10:09:19
为了避免在*nix上调用可能是任意字节序列('\0'除外)的shell和解码文件名,您可以将文件作为stdin传递:
import subprocess
with open(b'/var/log/syslog', 'rb') as file:
nlines = int(subprocess.check_output(['wc', '-l'], stdin=file))
print(nlines)或者您可以忽略任何解码错误:
import subprocess
stdoutdata = subprocess.check_output(['wc', '-l', '/var/log/syslog'])
nlines = int(stdoutdata.decode('ascii', 'ignore').partition(' ')[0])
print(nlines)https://stackoverflow.com/questions/18244126
复制相似问题