【问题标题】:Do a tail -f untill pattern found BACKWARDS执行 tail -f 直到找到 BACKWARDS 模式
【发布时间】:2021-01-19 07:43:02
【问题描述】:

我正在尝试获取日志文件的最后几行,我环顾四周,发现tail -f /path/to/file.log | sed '/^MYSTRING/ q' 是一种常用的方式! 但是这个获取数据直到它发现它匹配,而不是向后。

让我解释一下;

日志文件:(只是示例,不是实际日志;)

Donald
Duck
Cat
Dog
MYSTRING
animal
fish
ape

上面的代码会输出;

Donald
Duck
Cat
Dog
MYSTRING

但我想要最后一个 MYSTRING 之后的日志文件中的最后一个(是的,那里可能有一些我,这就是我需要向后执行此操作的原因),

animal
fish
ape

【问题讨论】:

  • MYSTRING后面要多少行?
  • 一般tail -f 用于监控增长日志文件。如果是这样,我们无法确定日志文件的最后几行。还是您只想打印静态(非增长)日志文件的指定模式之后的行?
  • @pynexj 从文件末尾到第一个 MYSTRING(向后)
  • @AdamLarsson :您基本上希望在遇到 MYSTRING 之后开始显示日志文件,然后继续显示它,同时进程写入文件它还在产生日志输出吗?
  • @adam right tail 知道文件的结尾,但问题是 tail -f 在到达 eof 时不会退出。相反,它会等待文件增长并继续打印新行。

标签: bash tail logfile


【解决方案1】:

在我看来,您根本不希望日志文件增长,因此tail -f 不适合您。如果是这样,您可以这样做:

[bash] # cat file
Donald
Duck
Cat
Dog
MYSTRING
animal
fish
ape
[bash] # awk 'flag { print } /MYSTRING/ { flag++ }' file
animal
fish
ape
[bash] #

【讨论】:

    【解决方案2】:

    这可以通过 sed 来实现:

    sed -zrn 's/(^.*MYSTRING\n)(.*$)/\2/p' file
    

    将文件用作单行 (-z) 并使用正则表达式 (-r) 拆分三个部分 仅用该行替换第二部分并打印结果。

    【讨论】:

      猜你喜欢
      • 2011-06-28
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多