2

次のようなログファイルがあります。

    2013-07-10 21:40:54 [INFO] Janus_Mesca joined the game
    2013-07-10 21:40:54 [INFO] Fenlig joined the game
    2013-07-10 21:41:21 [INFO] BigRedHoodie joined the game

「[INFO]」と「joined」の間に表示されるものをすべて印刷しようとしています。

私の試みでは、2 つの単語自体を削除することしかできませんでした。

    tail -500 $rfile | grep "INFO.*joined the game" | \
        sed -e 's/\[INFO\]\(.*\)joined/\1/'

手伝ってくれますか?

4

3 に答える 3

3

先読み/後読みを使用した純粋な grep バージョン。PS Option -P はどこでも利用できるわけではないかもしれませんが、賢いと思いました。

tail test.log | grep -Po '(?<=\[INFO\] ).*(?= joined .*)'
于 2013-07-10T23:12:26.190 に答える
1

あなたはほとんどそこにいます。パターンを行全体に一致させ、キャプチャした名前に置き換えるだけです。

grepあまり知られていない の機能を使用して、 の必要性をなくすこともできますsed:-nフラグを使用して、デフォルトで各行を印刷しないようにしp、一致する行を印刷するコマンドを追加します。

tail -n 500 $rfile | sed -n 's/.*INFO] \(.*\)joined .*/\1/p'
于 2013-07-10T23:05:04.107 に答える
1

これはひどい答えです:

awk -F" " '{print $4}' data

data は入力ファイルです。区切り文字がスペースの場合、出力は次のようになります。

Janus_Mesca
Fenlig
BigRedHoodie

[INFO] と Joined の間により厳密に固執したい場合は、別の方法があります。

awk -F"\\[INFO\\] " '{ split( $2, arr, " joined" ); print arr[1] }' data

角括弧をエスケープする方法を見つけるために、この回答をチェックする必要がありました。ユーザー名に先頭と末尾のスペースを残したい場合は、それぞれのパターンからそれらを取り除きます。

于 2013-07-10T23:06:49.190 に答える