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

重要な要素の1つは、出力がパイプラインを流れ続けることを許可するための--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

解決策は単純に思えた

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

しかし、 less は、増大するログ ファイルから新しい行を読み続けません。

于 2009-11-20T12:53:02.577 に答える
-1
tail -f service.log | grep <pattern>
于 2009-11-19T11:15:32.527 に答える