Упростите вывод `tcpdump` - PullRequest
       13

Упростите вывод `tcpdump`

0 голосов
/ 13 июня 2018

Я хочу преобразовать этот tcpdump вывод:

IP 10.10.10.1 > 20.20.20.1: ICMP echo request, id 8312, seq 0, length 64
IP 10.10.10.1.17441 > 20.20.20.1.22: Flags [S], seq 3936449810, win 65535, options [mss 1460,nop,wscale 6,sackOK,TS[|tcp]>

в:

IP 10.10.10.1 > 20.20.20.1: ICMP
IP 10.10.10.1.17441 > 20.20.20.1.22: tcp

Я много пытался преобразовать их с помощью сценария оболочки с помощью команды cutно я не могу.

Спасибо всем за помощь.

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Использование awk (или GNU gawk), установка разделителя полей FS на ":" и допущение, что дамп находится внутри test.txt:

gawk 'BEGIN{ FS=":" } { if($0 ~ / ICMP /){ print $1 ": ICMP" }else if($0 ~ /tcp[]]>/){ print $1 ": tcp" } }' test.txt

Ожидаемый результат:

IP 10.10.10.1 > 20.20.20.1: ICMP
IP 10.10.10.1.17441 > 20.20.20.1.22: tcp

tcpdump вывод может быть передан в gawk как

tcpdump <options> | gawk ' ... '
0 голосов
/ 13 июня 2018

Это строго cut метод.Предполагается, что ваш вывод всегда будет в этом формате.Как уже упоминалось, версия sed (или awk), вероятно, будет более динамичной.

Основной частью этого является аргумент -d (разделитель) и аргумент -f (поле).-f может указывать одно поле или диапазон полей, разделенных указанным разделителем (я считаю, что вкладки используются по умолчанию).

Если ваши выходные данные находятся в файле с именем output.txt, вы можете использовать этот маленькийскрипт.

line1="$(head -1 output.txt | cut -d ' ' -f1-5)"
line2="$(tail -1 output.txt | cut -d ' ' -f1-4) $(tail -1 output.txt | cut -d '|' -f2 | cut -d "]" -f1)"

echo "$line1"
echo "$line2"

Если ваш вывод хранится в переменной, называемой output, вы можете использовать этот скрипт с переменной, отправляемой в качестве параметра, подобного ./script.sh "$output"

arg="$1"
line1="$(echo "$arg" | head -1 | cut -d ' ' -f1-5)"
line2="$(echo "$arg" | tail -1 | cut -d ' ' -f1-4) $(echo "$arg" | tail -1 | cut -d '|' -f2 | cut -d "]" -f1)"

echo "$line1"
echo "$line2"

Output:

IP 10.10.10.1 > 20.20.20.1: ICMP
IP 10.10.10.1.17441 > 20.20.20.1.22: tcp
...