在 docker exec 命令的输出上运行 grep

在 docker exec 命令的输出上运行 grep

我正在重新措辞这个问题,因为它非常令人困惑并且措辞很糟糕......)-:

我有一个 docker 容器,我正在从中读取日志,如下所示:

docker exec -it my-container sh -c "export TERM=xterm && ls -t /logs/my-log.* | xargs zless -R"

现在,我想在输出上使用“grep”,但我遇到了一个问题,因为这个正在工作:

docker exec -it my-container sh -c "export TERM=xterm && ls -t /logs/my-log.* | xargs zless -R | grep sometext"

虽然这个不起作用:

docker exec -it my-container sh -c "export TERM=xterm && ls -t /logs/my-log.* | xargs zless -R" | grep sometext

(请注意,第一个工作命令在我发送的命令中包含 grep,在第二个工作命令中我在输出上运行 grep)

这对我来说很重要,因为我正在脚本中运行该命令,并且我希望允许在此脚本的输出上运行 grep 。

答案1

脚本正在运行“exec -it”,“t”代表 tty

zless 正在“思考”它前面有一个 tty,而没有额外的管道......

删除 't' 解决了问题(虽然它现在的行为像 zcat 而不是 zless,但由于管道正在工作,我可以简单地将其管道到 less...)

答案2

我真的不明白管道的意义。 zless是一个交互式程序,其输出ls看着,未解析。

反而:

... sh -c 'zgrep PATTERN /logs/my-log.*'

或者,如果文件太多,

... sh -c 'for pathname in /logs/my-log.*; do zgrep PATTERN "$pathname"; done'

或者,更有效地,

... sh -c 'find /logs/ -maxdepth 1 -type f -name "my-log.*" -exec zgrep PATTERN {} +'

相关内容