感谢这个论坛,我是新来的,这是我的第一篇文章。我希望它符合所有规则。希望成为这个社区的一部分。
如果我将其保存到日志文件(例如,通过“ cmd> logfile”保存,则我正在运行带有大量终端输出的模拟,这将超出磁盘空间)。现在,我想跟踪整个终端输出,但是同时,我想将特定的数据/行/值从该输出保存到文件中。
1)有什么办法可以解决这个问题?
2)或替代:是否可以保存日志文件,提取所需的数据,然后删除处理过的行以避免生成庞大的日志文件?
谢谢,stockzahn
如果可以在终端上仅查看要保留到日志文件中的行,那么解决方案就很简单了。假设您只想保留包含字符串Error
的行,然后尝试:
cmd | grep 'Error' > logfile
如果仅将包含logfile
的输出保存到Error
中,但是希望在终端上查看所有输出,则可以发出:
cmd | tee /dev/tty | grep Error > logfile
我们还需要知道cmd
的输出是定向到标准输出流还是定向到标准错误流,以微调答案。
您使用什么标准来决定保留哪些行?
一个常见的过滤器是只存储stderr。
cmdlist 2>logfile # stdout still to console
对于更复杂的过滤器,如果要保存到日志的特定模式,则可以使用sed
。这是一个简单的例子-
seq 1 100 | sed '/.*[37]$/w tmplog'
这将生成1到100之间的数字,并将它们全部发送到控制台,但是捕获以3
或7
至tmplog
结尾的所有数字。它还可以接受更复杂的命令列表,以帮助您更全面-
seq 1 100 | sed '/.*[37]$/w 37.log
/^2/w 37.log'
c.f。 sed
manual以获得更详细的细分。
您可能也希望输出错误,因此也可以保存该错误。
sed
对于更复杂的节省空间的计划,请创建一个命名管道,并在后台进程中压缩其中的日志。
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
将从命名管道读取并压缩它。
如果需要,可以将gzip
替换为tee
以减少两次浸渍的空间-
sed
我不太推荐这样做,因为您可能会过滤掉一些您没有意识到自己需要的东西。