awk или sed: лучший способ получить [этот текст] - PullRequest
0 голосов
/ 17 апреля 2009

Я пытаюсь проанализировать различную информацию из файлов журналов, некоторые из которых помещены в квадратные скобки. Например:

Tue, 06 Nov 2007 10:04:11 INFO     processor:receive: [someuserid], [somemessage]  msgtype=[T]

Какой элегантный способ получить «someuserid» из этих строк, используя sed, awk или другую утилиту unix?

Ответы [ 5 ]

7 голосов
/ 17 апреля 2009

вырезать
использовать его так: cut -f2 -d[ | cut -f1 -d]

bart@hal9k:~> YOURTEXT="Tue, 06 Nov 2007 10:04:11 INFO     processor:receive: [someuserid], [somemessage]  msgtype=[T]"
bart@hal9k:~> SOMEID=`echo $YOURTEXT | cut -f2 -d[ | cut -f1 -d]`
bart@hal9k:~> echo $SOMEID
someuserid
0 голосов
/ 17 марта 2010

Использование AWK:

cat file | awk -F[\]\[] '{print $2}'

Я обнаружил, что несколько разделителей не работают в некоторых старых версиях AWK. Если это не так, вы можете использовать два awk:

cat file | awk -F[ '{print $2}' | awk -F] '{print $1}'
0 голосов
/ 17 марта 2010
sed -n '/INFO/{s/.[^[]*\[//;s/\].*//p}' file
0 голосов
/ 28 ноября 2009

с использованием оболочки bash

while read -r line
do
   case "$line" in
        *processor*receive* ) 
            t=${line#*[}
            echo ${t%%]*}
            ;;
   esac
done < "file"
0 голосов
/ 17 апреля 2009

Если вы хотите что-то сделать с всеми полями в скобках, я бы использовал Perl:

perl -lne '
    my @fields = /\[(.*?)\]/g;
    # do something with @fields, like:
    print join(":", @fields);
' logfile ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...