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”之间出现的任何内容。

通过我的尝试,我只能自己删除这两个词。

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

你能帮我吗?

4

3 回答 3

3

Pure grep version with lookahead/lookbehind. P.S. Option -P might not be available everywhere, but I thought it was clever.

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 答案:

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

其中数据是输入文件。如果分隔符是空格,则输出如下:

Janus_Mesca
Fenlig
BigRedHoodie

如果您想更严格地坚持 [INFO] 和加入之间,这里有一个替代方案:

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

为此,我必须查看此答案以了解如何转义方括号。如果您希望在用户名中保留前导和尾随空格,请将它们从每个相应的模式中删除。

于 2013-07-10T23:06:49.190 回答