2009-11-19 73 views
5

當用例如「less -iS + F service.log」我想要 將顯示限制爲匹配特定模式的行。過濾功能少於+ F

我想是這樣

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

不工作。另外

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

不做我想要的。它看起來像輸入已經關閉,並且 更少不顯示更改。

如何限制顯示爲符合特定模式的行?

回答

0
tail -f service.log | grep <pattern> 
+0

感謝思考我的問題,雖然這不正是我想要的。 我希望在結果輸出中具有「少」功能,即滾動,搜索,高亮。 像 「尾巴-f service.log | grep的 |少+ F」,這unfortunalely沒有做到這一點。 – axelrose 2009-11-19 11:28:46

0

的解決方案似乎只是

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

但少不繼續讀從不斷增長的日誌文件中的新線路。

1

如果你不介意的產卵和拆除幾個過程的每一行,使用讀while循環

tail -f filename.log|while read line; do echo $line | grep pattern; done 
1

我還沒有制定出如何做到這一點沒有一個臨時文件,但這是一個腳本,演示功能grep - 過濾less +F(清理其臨時文件)。我稱之爲lessf

一個關鍵要素是--line-buffered參數grep允許tail輸出繼續通過管道流(由所述提供expect命令unbuffer提供類似的功能對任何程序)。

#!/bin/sh 
LOGFILE=$1 
shift 
[email protected] 
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