我有一个使用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
是简单的填充字节,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
Plase帮助我......
可能我已经解释了问题而不是需要但是确实需要它。
我是所有这些shell和awk的新手,因此可能会有一个我无法找到的愚蠢错误。
请帮帮我..
Thnx提前..
编辑:
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标题,将始终保持相同。
*之间的部分是可变长度的,这就是我需要以这种方式工作的原因,否则这将是一项简单的任务。
答案 0 :(得分:2)
_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
答案 1 :(得分:0)
我在代码中做了一些小改动,直到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脚本时,你必须删除它。
注意:我完全不理解你的要求
答案 2 :(得分:0)
如果我理解问题是:丢弃前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"'}$//'
诀窍是展开数据,然后选择你想要的位。