尾随文件以获取特定文本

尾随文件以获取特定文本

是否有类似于 tail 的 Linux 命令,您可以指定一串文本,而不是指定行数,而是从文件的最后一行到第一行搜索该文本,然后显示此后的所有或指定行数?我尝试捕获的日志末尾的内容可能在 0 到 10 行之间变化,因此当它不是 10 行时,它会使我复制到的日志文件难以理解。

从尾部手册页中,我只看到指定行或字节的能力。

答案1

指定一个文本字符串,然后显示其后的所有行

这里有一些可以使用的假数据:

$ seq 100 > input

...在这里,我正在搜索字符串“90”并显示其后的所有内容(直到$文件末尾):

$ sed -n '/90/,$p' input
90
91
92
93
94
95
96
97
98
99
100

如果您想要更灵活的解决方案,请使用变量,更改 sed 引号(并$从 shell 中转义,对于 sed):

$ t=96
$ sed -n "/$t/,\$p" input
# or
$ sed -n /$t/,\$p input
96
97
98
99
100

答案2

您可以使用此retail命令:https://github.com/mwh/retail

它支持用于启动和停止输出的正则表达式,因此您可能需要类似的内容:

retail -r STARTPATTERN mylogfile
retail -r STARTPATTERN -u ENDPATTERN -f mylogfile

-r选项显式查找模式的最后一个实例,这通常是您想要的。

也可以看看:https://superuser.com/questions/270529/monitoring-a-file-until-a-string-is-found

下面是一个使用 Apache 错误日志的示例,其中 Apache 已重新启动多次,用于retail仅提取最后一次重新启动:

$ grep -c "Apache.*resuming normal operations" /var/web/logs/error.log
8 
$ retail -r  "Apache.*resuming normal operations" /var/web/logs/error.log
[Wed Jul  6 17:12:55.534567 2016] [mpm_prefork:notice] [pid 17965] AH00163: Apache/2.4.4 (Unix) OpenSSL/1.0.1e configured -- resuming normal operations
[Wed Jul  6 17:12:55.534582 2016] [mpm_prefork:info] [pid 17965] AH00164: Server built: Mar 26 2016 12:22:17
[Wed Jul  6 17:12:55.534598 2016] [core:notice] [pid 17965] AH00094: Command line: '/usr/local/apache2/bin/httpd'

或者您可以使用正则表达式"(SIGTERM.* shutting down|SIGHUP.*restart)"来显示上次关闭或重新启动尝试后的所有内容。

答案3

如果您grep-A在每次比赛后显示一定数量的上下文行的标志,您可以执行以下操作:

grep -A 10 'pattern' logfile | less

答案4

为了完整起见,我将使用awk- 虽然您不需要它来完成此特定任务,但它是一个非常强大的工具,并且这就是它擅长解决的问题类型。

awk '/pattern/{x=1}x{print}'

x当找到模式时,这会设置变量,并在x为真时打印一行。请注意,这从第一的模式的出现。

相关内容