Bash 从句子中间提取单词

Bash 从句子中间提取单词,bash,sed,grep,Bash,Sed,Grep,我有这样一个日志文件: 2013-07-10 21:40:54[信息]Janus_Mesca加入了游戏 2013-07-10 21:40:54【信息】芬利格加入了游戏 2013-07-10 21:41:21[信息]BigRedHoodie加入了游戏 我正在尝试打印出现在“[INFO]”和“joined”之间的任何内容 通过我的努力,我只能删除这两个词本身 tail -500 $rfile | grep "INFO.*joined the game" | \ sed -e

我有这样一个日志文件:

2013-07-10 21:40:54[信息]Janus_Mesca加入了游戏
2013-07-10 21:40:54【信息】芬利格加入了游戏
2013-07-10 21:41:21[信息]BigRedHoodie加入了游戏
我正在尝试打印出现在“[INFO]”和“joined”之间的任何内容

通过我的努力,我只能删除这两个词本身

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

你能帮忙吗?

你就快到了。您只需要使模式与整行匹配,并用捕获的名称替换它

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

tail -n 500 $rfile | sed -n 's/.*INFO] \(.*\)joined .*/\1/p'
这是一个awk答案:

awk -F" " '{print $4}' data
其中数据是输入文件。如果分隔符是一个空格,则输出如下:

Janus_Mesca
Fenlig
BigRedHoodie

如果您想更严格地遵守[INFO]和Join之间的规则,这里有一个替代方案:

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

为此,我必须检查,以找出如何摆脱方括号。如果您想在用户名中保留前导空格和尾随空格,请将它们从各自的模式中去掉。

带lookahead/lookback的纯grep版本。 P.S.选项-P可能不适用于任何地方,但我认为它很聪明

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