Bash终端:仅将特定行写入日志文件

问题描述 投票:0回答:2

感谢这个论坛,我是新来的,这是我的第一篇文章。我希望它符合所有规则。希望成为这个社区的一部分。

如果我将其保存到日志文件(例如,通过“ cmd> logfile”保存,则我正在运行带有大量终端输出的模拟,这将超出磁盘空间)。现在,我想跟踪整个终端输出,但是同时,我想将特定的数据/行/值从该输出保存到文件中。

1)有什么办法可以解决这个问题?

2)或替代:是否可以保存日志文件,提取所需的数据,然后删除处理过的行以避免生成庞大的日志文件?

谢谢,stockzahn

bash logfile
2个回答
2
投票

如果可以在终端上仅查看要保留到日志文件中的行,那么解决方案就很简单了。假设您只想保留包含字符串Error的行,然后尝试:

cmd | grep 'Error' > logfile

如果仅将包含logfile的输出保存到Error中,但是希望在终端上查看所有输出,则可以发出:

cmd | tee /dev/tty | grep Error > logfile

我们还需要知道cmd的输出是定向到标准输出流还是定向到标准错误流,以微调答案。


0
投票

您使用什么标准来决定保留哪些行?

1

一个常见的过滤器是只存储stderr。

cmdlist 2>logfile # stdout still to console

2

对于更复杂的过滤器,如果要保存到日志的特定模式,则可以使用sed。这是一个简单的例子-

seq 1 100 | sed '/.*[37]$/w tmplog'

这将生成1到100之间的数字,并将它们全部发送到控制台,但是捕获以37tmplog结尾的所有数字。它还可以接受更复杂的命令列表,以帮助您更全面-

seq 1 100 | sed '/.*[37]$/w 37.log
                 /^2/w 37.log'

c.f。 sed manual以获得更详细的细分。

您可能希望输出错误,因此也可以保存该错误。

sed

3

对于更复杂的节省空间的计划,请创建一个命名管道,并在后台进程中压缩其中的日志。

seq 1 100 2>errlog | sed '/.*[37]$/w patlog'

这将显示所有输出,还将副本复制到命名管道; $: mkfifo transfer # creates a queue file on disk that $: gzip < transfer > log.gz & # reads from FIFO in bg, compresses to log $: seq 1 100 2>&1 | tee transfer # tee writes one copy to stdout, one to file 将从命名管道读取并压缩它。

3b

如果需要,可以将gzip替换为tee以减少两次浸渍的空间-

sed

我不太推荐这样做,因为您可能会过滤掉一些您没有意识到自己需要的东西。

© www.soinside.com 2019 - 2024. All rights reserved.