17

当使用例如“less -iS +F service.log”观看不断增长的日志文件时,我想将显示限制为与特定模式匹配的行。

我尝试了类似的东西

less +F service.log | grep <pattern> | less +F

这是行不通的。还

cat < service.log | grep <pattern> | less +F

不做我想做的事。看起来输入已经关闭并且 less 没有显示更改。

如何将显示限制为与特定模式匹配的行?

4

5 回答 5

21

这个问题已经很久了,但我仍然认为值得添加一个解决方案。与其尝试先 grep 然后使用 less ,不如在 less 中使用过滤呢?

简单来说:

  1. use less +F在你的档案上
  2. CTRL-C暂时中断“跟随”动作
  3. 键入&和您的模式以启用过滤
  4. +F重新启用“以下”操作的问题

Unix&Linux StackExchange上有关此答案的更多详细信息

于 2019-05-13T10:16:55.390 回答
2

我还没有弄清楚如何在没有临时文件的情况下做到这一点,但这里有一个脚本,它演示了一个经过功能grep过滤的脚本less +F(它清理了它的临时文件)。我称之为lessf

关键元素之一是允许输出继续流经管道的--line-buffered参数(提供的命令为任何程序提供类似的功能)。greptailunbufferexpect

#!/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

于 2011-12-29T02:06:11.810 回答
1

如果您不介意每行生成和拆除几个进程,请使用 read while 循环

tail -f filename.log|while read line; do echo $line | grep pattern; done
于 2011-08-11T16:10:22.497 回答
-1
tail -f service.log | grep <pattern>
于 2009-11-19T11:15:32.527 回答
-1

解决方案似乎很简单

LESSOPEN='|grep <pattern> %s' less +F service.log

但 less 不会继续从不断增长的日志文件中读取新行。

于 2009-11-20T12:53:02.577 回答