我有一个这样的日志文件:
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/'
你能帮忙吗?
答案 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以了解如何逃避方括号。如果您希望在用户名中留下前导和尾随空格,请将它们从每个相应的模式中取出。