8

最近使用していくつかのサーバーログを調べていましたがtail -f、出力をフォーマットできれば、いくつかのことを確認する方がはるかに簡単だと思いました。本当に私が探しているのは、おそらく特定の単語に色を付け(正規表現によって決定される)、おそらく特定の単語を削除する(これも正規表現によって決定される)方法です。

サーバーログをリアルタイムで視覚化するプログラムなどがあることは知っていますが、もっと興味があります

4

3 に答える 3

13

の出力をにパイプしtail -f、いくつかのANSIエスケープコードsedを追加します。たとえば、次のようにすると、すべての数値が赤(色31)で、引用符で囲まれたすべての文字列が明るい黄色(色93)で色付けされます。

RED=`echo -en '\e[31m'`
YELLOW=`echo -en '\e[93m'`
RESET=`echo -en '\e[00m'`
tail -f file | sed -E "s/([0-9]+)/$RED\1$RESET/g;s/(\"[^\"]*\")/$YELLOW\1$RESET/g"
于 2009-02-04T06:09:29.287 に答える
5

あなたが探しているのはsed、ANSIカラーエスケープシーケンスで選択した単語を囲むある種のスクリプトだと思います。(うーん...レンメルック)。

編集OK、わかりました:

「Hello」を濃い赤で出力する例を次に示します。

echo -e "\033[31mHello\033[0m"

何が起こっていますか?まず、スラッシュを画面上のスラッシュに変換せずに、のエスケープシーケンスを単一のエスケープ文字として読み取るecho -eために使用しています。これは実際には8進数で33、つまり27(ESCキーの序数)です。echo\033

したがって、実際に画面に送信されるのは次のようなものです。

<ESC>[32mHello<ESC>[0m

ANSIディスプレイは、「最初にコマンドを実行し、32m「Hello」を出力してから、コマンドを実行する」と解釈し0mます。

この場合、コマンド32mは「前景色を2に設定」を意味し、色#2が濃い赤であるため、端末で使用される「ペン」は濃い赤になります。つまり、この時点以降、画面に表示されるすべてのテキストは濃い赤になります。

赤になっているはずのテキストの出力が終わったら、色をリセットしたいので0m、色を通常にリセットするコマンドを呼び出します。

すべてのエスケープコードのリストについては、[ http://en.wikipedia.org/wiki/ANSI_escape_code Wikipedia]を検索するか、Googleで検索してください。

したがって、sedスクリプトで実行する必要があるのは、選択した単語を色で囲まれた単語に置き換えることだけです。たとえば、の「Feb」という単語を置き換えるに/var/log/messagesは、次のようにします。

tail /var/log/messages | sed -e "s/Feb/\\o033[31m&\\o033[0m/"

(実際に読み取るには、rootとしてこれを行う必要がある場合があります/var/log/messages

sed「2月」という単語を検索し、上記で使用したのと同じエスケープシーケンスで囲みます。

複数の単語に色を付けるために展開できます。

tail /var/log/messages | sed -e "s/\(Feb\|Mar\|Apr\)/\\o033[31m&\\o033[0m/g"

「2月」、「3月」、「4月」の色はそれぞれ濃い赤になります。

これがあなたにあなたが必要なことをする方法のいくつかのアイデアを与えることを願っています!

于 2009-02-04T06:02:12.203 に答える
3

scraimer と Adam のおかげで、私が求めていたもののほとんどを思いついたので、他の人のためにここで共有したいと思いました。

RED=`echo -en '\e[31m'`
YELLOW=`echo -en '\e[93m'`
RESET=`echo -en '\e[00m'`

# line breaks here are just for formatting
tail -f ~/access-logs/access.log | sed -e "s@\([0-9\.]\+\) - - 
    \[[0-9]\+/[a-zA-Z]\+/[0-9]\+:\([0-9]\+:[0-9]\+:[0-9]\+\) +[0-9]\+] \"
    \(.\+\) HTTP/1\.[01]\" \([0-9]\+\) \([-0-9]\+\) \"\([^\"]\+\)\".*
    @\n\2 $YELLOW\4$RESET (\1)\n$RED\3$RESET\nBytes: \5\nFrom: \6@g"

# here's the full line if you wanted to copy it
# tail -f ~/access-logs/access.log | sed -e "s@\([0-9\.]\+\) - - \[[0-9]\+/[a-zA-Z]\+/[0-9]\+:\([0-9]\+:[0-9]\+:[0-9]\+\) +[0-9]\+] \"\(.\+\) HTTP/1\.[01]\" \([0-9]\+\) \([-0-9]\+\) \"\([^\"]\+\)\".*@\n\2 $YELLOW\4$RESET (\1)\n$RED\3$RESET\nBytes: \5\nFrom: \6@g"

これは次のようになります。

182.108.1.20 - - [04/Feb/2009:23:24:41 +1000] "GET /images/exam_room.jpg HTTP/1.0" 200 8559 "http://www.myserver.com/courses/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"

これに(ただし、いくつかの色があります):

23:24:41 200 (182.108.1.20)
GET /images/exam_room.jpg
Bytes: 8559
From: http://www.myserver.com/courses/
于 2009-02-04T13:28:44.003 に答える