Путаница при извлечении необходимой части файла с использованием awk - PullRequest
1 голос
/ 02 ноября 2011

У меня есть скрипт, использующий 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, всегда будут оставаться такими же.

Часть между * имеет переменную длину, поэтому янужно работать таким образом, иначе это была бы простая задача.

Ответы [ 3 ]

2 голосов
/ 02 ноября 2011
_padlen=3 _length=23

awk '{
  for (i = NF - l - p - 2; i < NF - p - 2; i++)
    printf "%s", ($i (i < NF - p - 2 - 1 ? OFS : ORS))
  }' l="$_length" p="$_padlen" RS=  ORS='\n' decrypt.txt
0 голосов
/ 02 ноября 2011

Если я понимаю проблему следующим образом: отбросить первые 40 значений и последние n значений (где n - это заполнение + 2, т.е. в данном случае 3 + 2 = 5), это может сработать:

header=40;padding=5;
tr -d '\n' <decrypt.txt |
sed -r 's/\s+/ /g;s/^(\S+\s+){'"$header"'}//;s/(\S+\s*){'"$padding"'}$//'

Хитрость заключается в том, чтобы развернуть данные и затем выбрать нужные биты.

0 голосов
/ 02 ноября 2011

Я сделал несколько небольших изменений в коде и смог получить до 6e *

size=68; padlen=3 ;awk -v size=$size -v padlen=$padlen 'BEGIN {RS=" ";ORS=" ";} {if (NR > 40 && NR <=size-padlen-1) print $0}' decrypt.txt | sed '1,1s/ //'

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

Примечание. Я не полностью понял ваше требование

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...