从句子中间提取单词

时间:2013-07-10 22:55:17

标签: bash sed grep

我有一个这样的日志文件:

    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]”和“已加入”之间出现的内容。

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

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

你能帮忙吗?

3 个答案:

答案 0 :(得分:3)

具有前瞻/后瞻的纯grep版本。 附:选项-P可能无处可用,但我认为它很聪明。

tail test.log | grep -Po '(?<=\[INFO\] ).*(?= joined .*)'

答案 1 :(得分:1)

你快到了。您只需要使模式与整个行匹配,并将其替换为您捕获的名称。

您还可以使用grep的鲜为人知的功能来消除对sed的需求:使用-n标志可以防止它默认打印每一行,并添加一个p命令使其打印匹配的行:

tail -n 500 $rfile | sed -n 's/.*INFO] \(.*\)joined .*/\1/p'

答案 2 :(得分:1)

这是一个awk答案:

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

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

Janus_Mesca
Fenlig
BigRedHoodie

如果你想更严格地坚持[INFO]和加入这里的另一种选择:

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

我必须查看this answer以了解如何逃避方括号。如果您希望在用户名中留下前导和尾随空格,请将它们从每个相应的模式中取出。