如何在syslog.gz中删除,同时使用grep查找行?-Linux



我写了一个程序,搜索最旧的日志,然后我想检查日志,例如,如果有从日期"7月30日22:40";。我想删除这些日志。但我在这里或其他地方都没有发现这样的东西。你能帮我吗?

var = subprocess.Popen('find /var/log/syslog* -mtime +%i' % specific_delete_range, stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
out, err = var.communicate()
out = out.decode('ascii')
for line in out.split():
firstresult.append(line)
for element in firstresult:
with gzip.open(element, 'rb') as f:
for line in f:
if my_str_as_bytes in line:
rightlines.append(line)

因此,列表中的行";"右线",应删除。

不能在文件中间‘删除行’。即使这对普通文件来说是可能的,但对压缩文件来说也是不可能的,因为压缩文件是由"块"组成的,而且块很可能不会在行边界上对齐。

或者,可以考虑将要留在文件中的内容提取到新文件中,然后重命名新文件以覆盖旧文件。

下面的bash脚本查找模式";P〃;在压缩的日志文件中,并将内容替换为不具有模式"的行的新文件;P〃;。

注意:该脚本不会处理未压缩的文件(类似于OP脚本的工作方式(。模式/var/log/syslog*被修改为只选择压缩文件(/var/log/ssyslog*.gz(。这可能需要根据压缩文件使用的实际后缀进行调整。

days=30   # Change to whatever file age
P="Jul 30 22:40"    # Pattern to remove
P=
for file in $(zfgrep -l "$P" $(find /var/log/syslog*.gz -mtime +$days)) ; do
# Extract content, re-compress and overwrite old files
zfgrep -v "$P" $file | gzip > $file.new && mv $file.new $file
done

从某种意义上说,在Python中这样做有点疯狂,因为在shell脚本中更容易简洁地做到这一点。但这里有一个重构代码的尝试。

如果可以的话,你通常应该避免subprocess.Popen();使用subprocess.run(),您的代码会更简单、更地道。但在这种情况下,当find可能返回大量匹配时,我们可能希望在报告文件时对其进行处理,而不是等待子进程完成,然后收集其输出。使用此堆栈溢出答案中的代码,并根据';shell=真';在避免shell=True的子过程中,尝试类似的方法

#!/usr/bin/env python3
from subprocess import Popen, PIPE
import gzip
from tempfile import NamedTemporaryFile
import shutil
import os

with Popen(
['find' '/var/log', '--name=syslog*', '-mtime', '+' +  specific_delete_range],
stdout=PIPE, bufsize=1, text=True) as p:
for filename in p.stdout:
filename = filename.rstrip('n')
temp = NamedTemporaryFile(delete=False)
with gzip.open(filename, 'rb') as f, gzip.open(temp, 'wb') as z:
for line in f:
if my_str_as_bytes not in line:
z.write(line)
os.unlink(filename)
shutil.copy(temp, filename)
os.unlink(temp)

对于text=True,我们不必decode来自Popen的输出。来自gzip的行仍然是二进制字节;当然,我们可以对它们进行解码,但正如您所做的那样,将搜索字符串编码为字节会更有效。

这里的牛肉是使用一个临时文件来过滤结果,然后在我们完成写入后将其移回原始文件的顶部

NamedTemporaryFile在Windows上有一些令人悲伤的怪癖,但幸运的是,你不在Windows上。

相关内容

  • 没有找到相关文章

最新更新