2013-07-10 4 views
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]» и «присоединился».

С моими попытками я смог удалить только два слова.

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

Вы не можете помочь?

ответ

3

Pure grep version with lookahead/lookbehind. P.S. Вариант -P может быть недоступен повсюду, но я думал, что он умный.

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

Вы почти у цели. Вам просто нужно сделать шаблон совпадением всей линии и заменить его на имя, которое вы захватили.

Вы можете также устранить необходимость в grep с использованием менее известной особенностью sed:   Используйте -n флаг, чтобы предотвратить его от печати каждой строки по умолчанию, и добавить команду p, чтобы сделать его напечатать совпадающие строки:

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

Это AWK ответ:

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

где данные файла ввода. При условии, что разделителем является пробел, выход как:

Janus_Mesca 
Fenlig 
BigRedHoodie 

Если вы хотите придерживаться более строго между [INFO] и воссоединиться альтернатива:

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

, для которых Я должен был проверить this answer, чтобы узнать, как избежать квадратных скобок. Если вы хотите, чтобы начальное и конечное пространства остались в имени пользователя, выведите их из каждого соответствующего шаблона.

Смежные вопросы