我正在重新措辞这个问题,因为它非常令人困惑并且措辞很糟糕......)-:
我有一个 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 {} +'