我有一个使用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