散列文本文件中每行的第一列,并将其写入文件的第三列

问题描述 投票:1回答:2

我有一个文件格式如下:

Value1 = Value1 <Value1>
Value2 = Value2 <Value2>
value3 = Value3 <Value3>

我想编写一个脚本,将每行中的第一个Value字段作为输入并计算它的哈希值,然后将其写入=符号右侧的相应字段。我的所有输入值都是明文。

所以我最终得到这样的东西:

Value1 = 7EE5A281B28D7CA1FAB06B43D0B7D8AC <7EE5A281B28D7CA1FAB06B43D0B7D8AC>
Value2 = 0FE13ED1638DA4D4B1EF316729F3BB32 <0FE13ED1638DA4D4B1EF316729F3BB32>
Value3 = 121BCEF76AA7694F7D8EF4D381B86DAD <121BCEF76AA7694F7D8EF4D381B86DAD>

到目前为止,我已经使用了以下帮助:

awk '{cmd=sprintf("echo -n \"%s\"|md5sum",$3); 
   cmd|getline $3;close(cmd)}7' file

它将以下内容写入我的输出文件:

Value1 = 7EE5A281B28D7CA1FAB06B43D0B7D8AC - <value1>

这几乎是完整的解决方案,但我需要将哈希值复制到“<>”字符之间以及之前的值字段(这是一个电子邮件地址字段,但我可以用我的情况下的用户名哈希替换它) 。我还需要在要删除的字段之间写入“ - ”字符。

我怎样才能让它完美地运作?

谢谢

awk sed replace hash
2个回答
0
投票

也许是这样的:

awk '{cmd="echo -n " $3 " | md5sum"; if( (cmd | getline md5) > 0 ) {close(cmd);sub(/ .*/,"",md5);md5=toupper(md5)};$3=md5;$4="<" md5 ">";}1' file
Value1 = 7EE5A281B28D7CA1FAB06B43D0B7D8AC <7EE5A281B28D7CA1FAB06B43D0B7D8AC>
Value2 = 0FE13ED1638DA4D4B1EF316729F3BB32 <0FE13ED1638DA4D4B1EF316729F3BB32>
value3 = 121BCEF76AA7694F7D8EF4D381B86DAD <121BCEF76AA7694F7D8EF4D381B86DAD>

鉴于<>内外的价值保证相同......

如果你安装了ruby,这里有一个丑陋但可能更有效的方法:

ruby -rdigest -lane 'md5=Digest::MD5.hexdigest($F[2]).upcase;$F[2]=md5;$F[3]="<" + md5 + ">"; print $F.join " "' file

0
投票

假设你会做一个md5哈希,这个gawk one-liner给你一个开始:

awk '{cmd=sprintf("echo -n \"%s\"|md5sum",$3);
         cmd|getline $3;close(cmd)}7' file
© www.soinside.com 2019 - 2024. All rights reserved.