是否有类似于 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
为真时打印一行。请注意,这从第一的模式的出现。