Bash 终端:仅将特定行写入日志文件
Bash Terminal: Write only specific lines to logfile
我正在 运行 模拟,有很多终端输出,如果我将它保存到日志文件(例如 "cmd > logfile"),这将超过我的光盘 space。现在我想关注整个终端输出,但同时我想将此输出中的特定 data/lines/values 保存到文件中。
1) bash 有办法吗?
2) 或者作为替代方案:是否可以保存日志文件,提取所需数据,然后删除已处理的行以避免生成巨大的日志文件?
如果您只想将包含 mypattern
的输出保存到 logfile
,但您希望在终端看到所有输出,您可以发出:
cmd 2>&1 | tee /dev/tty | grep 'mypattern' > logfile
我还假设 cmd
的输出可以通过在 cmd
之后添加 2>&1
来定向到标准输出流和标准错误流。
您使用什么标准来决定保留哪些行?
1
一个常见的过滤器是只存储 stderr。
cmdlist 2>logfile # stdout still to console
2
对于更复杂的过滤器,如果您有特定的模式要保存到日志中,可以使用 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 以获得更详细的细分。
您可能也想要错误输出,所以最好也保存它。
seq 1 100 2>errlog | sed '/.*[37]$/w patlog'
3
对于更复杂的 space 节省计划,创建命名管道,并在后台进程中压缩日志。
$: 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
将从命名管道中读取并压缩它。
3b
如果需要,您可以将 tee
替换为 sed
以进行双浸 space 减少 -
$: mkfifo transfer
$: gzip < transfer > log.gz &
$: seq 1 100 2>&1 | sed '/.*[37]$/w transfer'
我真的不推荐这样做,因为您可能会过滤掉一些您没有意识到自己需要的东西。
我正在 运行 模拟,有很多终端输出,如果我将它保存到日志文件(例如 "cmd > logfile"),这将超过我的光盘 space。现在我想关注整个终端输出,但同时我想将此输出中的特定 data/lines/values 保存到文件中。
1) bash 有办法吗?
2) 或者作为替代方案:是否可以保存日志文件,提取所需数据,然后删除已处理的行以避免生成巨大的日志文件?
如果您只想将包含 mypattern
的输出保存到 logfile
,但您希望在终端看到所有输出,您可以发出:
cmd 2>&1 | tee /dev/tty | grep 'mypattern' > logfile
我还假设 cmd
的输出可以通过在 cmd
之后添加 2>&1
来定向到标准输出流和标准错误流。
您使用什么标准来决定保留哪些行?
1
一个常见的过滤器是只存储 stderr。
cmdlist 2>logfile # stdout still to console
2
对于更复杂的过滤器,如果您有特定的模式要保存到日志中,可以使用 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 以获得更详细的细分。
您可能也想要错误输出,所以最好也保存它。
seq 1 100 2>errlog | sed '/.*[37]$/w patlog'
3
对于更复杂的 space 节省计划,创建命名管道,并在后台进程中压缩日志。
$: 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
将从命名管道中读取并压缩它。
3b
如果需要,您可以将 tee
替换为 sed
以进行双浸 space 减少 -
$: mkfifo transfer
$: gzip < transfer > log.gz &
$: seq 1 100 2>&1 | sed '/.*[37]$/w transfer'
我真的不推荐这样做,因为您可能会过滤掉一些您没有意识到自己需要的东西。