Это мой входной файл для проблемы, он содержит различные типы ч / б пакетов вместе с информацией заголовка.
Это образец файла, состоящий только из двух пакетов ...
18:10:17.528660 IP6 2001::100 > 2001::200: ESP(spi=0x00005fb4,seq=0x23),
length 168
0x0000: 6000 0000 00A8 3220 2001 0000 0000 0000 ................
0x0010: 0000 0000 0000 0100 2001 0000 0000 0000 ................
0x0020: 0000 0000 0000 0200 0000 5FB4 0000 0023 ................
0x0030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0060: 5361 6C74 6564 5F5F 1267 6EE1 8FFD A625 ................
0x0070: 6DAB 0F22 B006 0809 505F CD62 4C4F FCC2 ................
0x0080: 0966 DD9A E1E8 F582 EF63 C8BF 5F08 3D46 ................
0x0090: 3033 3361 3666 6131 3430 3036 6163 3931 ................
0x00a0: 3365 6137 3936 3866 6133 6334 6434 3837 ................
0x00b0: 3037 6531 6534 3761 0A00 0000 0000 0000 ................
0x00c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
18:10:17.528660 IP6 2001::100 > 2001::200: ESP(spi=0x00005fb4,seq=0x23),
length 168
0x0000: 6000 0000 0070 3220 0000 0000 0000 0000 ................
0x0040: 0000 0000 0000 0001 0000 0000 0000 0000 ................
0x0050: 0000 0000 0000 0002 0000 0270 0000 000D ................
0x0060: 5361 6C74 6564 5F5F 682A CB8F 97D9 10A2 ................
0x0070: 1D12 88CB EE21 9F00 42AF AFA4 C919 B1E6 ................
0x0080: 045A B5DF 93BE FA50 3231 3164 3939 6534 ................
0x0090: 3332 6563 3634 3737 6133 6265 3231 6161 ................
0x00a0: 3730 3866 6331 3636 3363 3933 6232 3264 ................
0x00b0: 0A00 0000 0000 0000 0000 0000 0000 0000 ................
0x00c0: 0000 0000 0000 0000 ........
эти ...
могут быть любыми символами ascii, соответствующими указанным шестнадцатеричным символам.Мне нужно извлечь среднюю шестнадцатеричную часть только каждого пакета.
Мне нужен вывод в следующем формате.
6000 0000 00A8 3220 2001 0000 0000 0000
0000 0000 0000 0100 2001 0000 0000 0000
0000 0000 0000 0200 0000 5FB4 0000 0023
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
5361 6C74 6564 5F5F 1267 6EE1 8FFD A625
6DAB 0F22 B006 0809 505F CD62 4C4F FCC2
0966 DD9A E1E8 F582 EF63 C8BF 5F08 3D46
3033 3361 3666 6131 3430 3036 6163 3931
3365 6137 3936 3866 6133 6334 6434 3837
3037 6531 6534 3761 0A00 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
Например, здесь два файла должны генерировать именно ipsec_packet1.txt и ipsec_packet2.txt и каждый из них должны состоять из средней шестнадцатеричной части, указанной только в вышеуказанном формате.
Вот мой сценарий ..
cat received_ipsec.txt | tr '[a-z]' '[A-Z]' > tmp_tcpdump.txt
count=`grep -w -c 0X0000 tmp_tcpdump.txt`
grep -w -n 0X0000 tmp_tcpdump.txt > tmp_samp.txt
i=1
cut -d ":" -f$i tmp_samp.txt | tr '\n' ' ' > tmp_try.txt
while [ $i -le $count ]
do
k=`expr $i + 1 `
prev_j=`cut -d " " -f$i tmp_try.txt`
next_j=`cut -d " " -f$k tmp_try.txt`
// эта часть требует внимания ......
if [ $i -eq $count ]
then
awk -v prev_j=$prev_j '{if(NR>=prev_j)print $0}'
tmp_tcpdump.txt > tmp_packet.txt
// first trial failed so commented
# cut -d ":" -f2 tmp_packet.txt | sed 's/ *//' |
# cut -d " " -f1-8 > ipsec_packet$i.txt
// secone trial failde so commented
# cut -d " " -f 3-10 tmp_packet.txt > ipsec_packet$i.txt
// third one although it also not working properly but will
explain it below
cut -d ":" -f2 tmp_packet.txt | awk -F " "
'{printf "%s %s %s %s %s %s %s %s \n",
$1,$2,$3,$4,$5,$6,$7,$8}' >ipsec_packet$i.txt
else
awk -v prev_j=$prev_j -v next_j=$next_j
'{if(NR>=prev_j && NR<next_j-1)print $0}' tmp_tcpdump.txt
> tmp_packet.txt
# cut -d ":" -f2 tmp_packet.txt | sed 's/ *//' |
# cut -d " " -f1-8 > ipsec_packet$i.txt
# cut -d " " -f 3-10 tmp_packet.txt > ipsec_packet$i.txt
cut -d ":" -f2 tmp_packet.txt | awk -F " "
'{printf "%s %s %s %s %s %s %s %s \n",
$1,$2,$3,$4,$5,$6,$7,$8}' > ipsec_packet$i.txt
fi
i=`expr $i + 1 `
done
Теперь проблема в создании детали ...
cut -d ":" -f2 tmp_packet.txt | awk -F " "
'{printf "%s %s %s %s %s %s %s %s \n",
$1,$2,$3,$4,$5,$6,$7,$8}'
если последняя строка что-то вроде этого, то проблем нет (как в пакете 1 выше)
0000 0000 0000 0000 0000 0000 0000 0000
, но если в последней строке что-то вроде этого, то возникает проблема (как в пакете 2 выше)
0000 0000 0000 0000
, тогда он будет захватывать остальные четыре поля из пунктирной части, как ..
0000 0000 0000 0000 ....
Может быть, я не требую всего этого для выполнения своей задачи, но я новичок, поэтому не знаю много об этом sed/awk
мире.
РЕДАКТИРОВАТЬ:
это вывод одного из образцов grep ... и у меня нет никаких причин, почему этов этом формате.Вот почему я не использовал простую cut by column
логику
2: 0X0000: 6000 0000 00A8 3220 2001 0000 0000 0000
16: 0X0000: 6000 0000 0070 3220 0000 0000 0000 0000
27: 0X0000: 6000 0000 0080 3220 0000 0000 0000 0000