У меня есть скрипт, использующий awk, sed, grep и другие функции оболочки.
Я застрял в одном месте, поэтому мне нужна ваша помощь ...
Это input
файл для моей проблемы
udit@udit-Dabba ~/ah $ cat decrypt.txt
60 00 00 00 00 17 3a 20 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 02 *00 00 e0 f9 6a 61 61 6e
65 6b 61 68 61 6e 67 61 79 65 77 6f 64 69 6e* 00
00 00 03 29
Моя цель - извлечь 00 00 e0 f9 6a 61 61 6e
65 6b 61 68 61 6e 67 61 79 65 77 6f 64 69 6e
из вышеупомянутого файла, также отмеченного между *
выше
Хотя это очевидно, но эти *
здесь показаны, чтобы прояснить ситуацию, на самом деле их нет в файле.
Последние пять блоков файла, как показано выше:
00 00 00 03 29
Это 00
простые байты пэдов, а 03
задают их длину пэдов
, и теперь вот часть скрипта для извлечения необходимой части:
size=`wc -w decrypt.txt`
padlen=3 // calculated by some other mechanism
awk -v size=$size -v padlen=$padlen 'BEGIN {RS=" ";ORS=" ";} {if (NR > 40
&& NR <=size-padlen-2) print $0}' decrypt.txt | sed '1,1s/ //'
вывод:
00 00 e0 f9 6a 61 61 6e
65 6b 61 68 61 6e 67 61 79 65 77 6f 64 69
Моя проблема: последний блок 6e
отсутствует
Также пробовал через терминал ...
size=68,padlen=3
, поэтому цикл должен идти от NR=40 to NR<=63
udit@udit-Dabba ~/ah $ awk 'BEGIN {RS=" ";ORS=" ";} {if (NR > 40 && NR <= 65)
print $0}' decrypt.txt | sed '1,1s/ //'
00 00 e0 f9 6a 61 61 6e
65 6b 61 68 61 6e 67 61 79 65 77 6f 64 69 6e 00
00
Работать нормально, если цикл поднимается до 65
. Так что также должен работать до 63
udit@udit-Dabba ~/ah $ awk 'BEGIN {RS=" ";ORS=" ";} {if (NR > 40 && NR <= 64)
print $0}' decrypt.txt | sed '1,1s/ //'
00 00 e0 f9 6a 61 61 6e
65 6b 61 68 61 6e 67 61 79 65 77 6f 64 69 6e
Но чтона это ????когда я уменьшаю 65
до 64
, происходит потеря двух 00
единиц. Почему это происходит ???
Также попробовал это, но не смог найти причину, почему этот странный вывод.
udit@udit-Dabba ~/ah $ awk 'BEGIN {RS="[ \n]";ORS=" ";} {if (NR > 40
&& NR <=65)print $0}' decrypt.txt | sed '1,1s/ //'
0002 00 00 e0 f9 6a 61 61 6e 65 6b 61 68 61 6e 67 61 79 65 77 6f 64
Пожалуйста, помогите мне ...
Может быть, я объяснил проблему больше, чем требуется, но действительно нужно это.
Я новичок во всех этихShell и awk вещи и так может быть глупая ошибка, которую я не мог обнаружить.
Пожалуйста, помогите мне в этом ..
Спасибо заранее ..
РЕДАКТИРОВАТЬ:
60 00 00 00 00 17 3a 20 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 02
Это фиксированные 40 единиц заголовка ipv6, всегда будут оставаться такими же.
Часть между * имеет переменную длину, поэтому янужно работать таким образом, иначе это была бы простая задача.