当使用例如“less -iS +F service.log”观看不断增长的日志文件时,我想将显示限制为与特定模式匹配的行。
我尝试了类似的东西
less +F service.log | grep <pattern> | less +F
这是行不通的。还
cat < service.log | grep <pattern> | less +F
不做我想做的事。看起来输入已经关闭并且 less 没有显示更改。
如何将显示限制为与特定模式匹配的行?
当使用例如“less -iS +F service.log”观看不断增长的日志文件时,我想将显示限制为与特定模式匹配的行。
我尝试了类似的东西
less +F service.log | grep <pattern> | less +F
这是行不通的。还
cat < service.log | grep <pattern> | less +F
不做我想做的事。看起来输入已经关闭并且 less 没有显示更改。
如何将显示限制为与特定模式匹配的行?
这个问题已经很久了,但我仍然认为值得添加一个解决方案。与其尝试先 grep 然后使用 less ,不如在 less 中使用过滤呢?
简单来说:
use less +F
在你的档案上CTRL-C
暂时中断“跟随”动作&
和您的模式以启用过滤+F
重新启用“以下”操作的问题Unix&Linux StackExchange上有关此答案的更多详细信息
我还没有弄清楚如何在没有临时文件的情况下做到这一点,但这里有一个脚本,它演示了一个经过功能grep
过滤的脚本less +F
(它清理了它的临时文件)。我称之为lessf
。
关键元素之一是允许输出继续流经管道的--line-buffered
参数(提供的命令为任何程序提供类似的功能)。grep
tail
unbuffer
expect
#!/bin/sh
LOGFILE=$1
shift
PATTERN=$@
TEMP_DIR=/tmp/lesstmp
TEMP_FILE="$TEMP_DIR/$(basename $LOGFILE)"
[ ! -d $TEMP_DIR ] && mkdir $TEMP_DIR
trap 'rm -rf "$TEMP_DIR"; exit' INT TERM EXIT
( tail -f "$LOGFILE" | grep --line-buffered $PATTERN ) > "$TEMP_FILE" | less +F "$TEMP_FILE"
trap - INT TERM EXIT
示例用法:
lessf /var/log/system.log foobar
lessf /var/log/system.log -v nobar
如果您不介意每行生成和拆除几个进程,请使用 read while 循环
tail -f filename.log|while read line; do echo $line | grep pattern; done
tail -f service.log | grep <pattern>
解决方案似乎很简单
LESSOPEN='|grep <pattern> %s' less +F service.log
但 less 不会继续从不断增长的日志文件中读取新行。