Извлечение определенных слов из строки - PullRequest
6 голосов
/ 08 января 2012

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

Jan  8 14:12:56 kernel: SRC=1.2.3.4 DST=255.255.255.255 LEN=104 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=UDP SPT=44224 DPT=14000 LEN=84

Я хочу извлечь слова, начинающиеся с SRC =, PROTO = и DPT =.Моя цель - получить строку, похожую на эту:

1.2.3.4 UDP 14000

Я бы предпочел, чтобы решение было bash с использованием sed, awk или аналогичного, если это возможно.

Ответы [ 4 ]

7 голосов
/ 08 января 2012

Используйте Sed с группами:

sed -r 's/.*SRC=(\S+).*PROTO=(\S+).*DPT=(\S+).*/\1 \2 \3/'
2 голосов
/ 08 января 2012

В одну сторону, используя awk:

awk 'BEGIN { FS = "[ =]" } { print $7, $22, $26 }' infile

Выход:

1.2.3.4 UDP 14000
1 голос
/ 09 января 2012

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

grep SRC= /var/log/messages |
while read mon day time kernel src dst len tos prec ttl id if proto spt dpt etc; do
    echo ${src#*=} ${proto#*=} ${dpt#*=}
done

Если у вас есть данные в $ string и желаемые параметры находятся на фиксированных позициях, вы также можете

set -- $string
echo ${5#SRC=} ${13#PROTO=} ${15#DPT=}

Если ваша оболочка не может обрабатывать позиционные параметры свыше $ 9, вам потребуется несколько shift с.

0 голосов
/ 08 января 2012

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

Вы можете использовать регулярное выражение grep's perl, чтобы найти текст. Здесь мы используем положительный взгляд позади. Поскольку выходные данные отображаются в отдельной строке, вы можете использовать функцию tr, чтобы заменить new line на space.

grep -Po "(?<=SRC=)[0-9.]+|(?<=PROTO=)([A-Z]+)|(?<=DPT=)([0-9]+)" INPUT_FILE | 
tr "\n" " "

Тест:

Шаг: 1: Использование grep

[jaypal:~/Temp] grep -Po "(?<=SRC=)[0-9.]+|(?<=PROTO=)([A-Z]+)|(?<=DPT=)([0-9]+)" file
1.2.3.4
UDP
14000

Шаг: 2: Передать вывод в tr

[jaypal:~/Temp] grep -Po "(?<=SRC=)[0-9.]+|(?<=PROTO=)([A-Z]+)|(?<=DPT=)([0-9]+)" file | 
tr "\n" " "
1.2.3.4 UDP 14000 
...