我有一个使用awk、sed、grep和其他shell特性的脚本。
我被困在一个地方所以需要你的帮助…
这是我的问题的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是简单的pad字节,03指定它们的pad长度
下面是脚本中提取所需部分的部分:
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开始
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

如果循环达到NR=40 to NR<=63,则工作正常。因此也应达到65
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

但这是什么????当我将63降低到65时,有两个64单元丢失。为什么会发生这种情况???
也试过这个,但找不到为什么这个奇怪的输出。
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

请帮帮我…
可能是我对问题的解释超出了要求,但我确实需要它。
我是新来的这些贝壳和可怕的东西,所以可能有一个愚蠢的错误,我无法发现。
请帮我…
提前……
编辑:
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头,将始终保持不变。
*之间的部分是可变长度的,这就是为什么我需要以这种方式工作,否则这将是一个简单的任务。

最佳答案

_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

10-02 04:42
查看更多