免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11203 | 回复: 11
打印 上一主题 下一主题

[文本处理] 用awk写的base64编码脚本,大家帮忙修改一下! [复制链接]

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
1 [报告]
发表于 2013-12-25 15:10 |显示全部楼层
本帖最后由 Herowinter 于 2013-12-25 15:12 编辑

回复 1# bikkuri

开始有这个错误,好象是说and lshift rshift是内建函数,
不能重定义;
  1. ./base64.sh Hello
  2. awk: cmd. line:9:     function and(var,x,l_res,l_i)
  3. awk: cmd. line:9:              ^ `and' is a built-in function, it cannot be redefined
  4. awk: cmd. line:21:     function lshift(var,x)
  5. awk: cmd. line:21:              ^ `lshift' is a built-in function, it cannot be redefined
  6. awk: cmd. line:30:     function rshift(var,x)
  7. awk: cmd. line:30:              ^ `rshift' is a built-in function, it cannot be redefined
复制代码
然后我把and  lshift rshift改名为
base64_and, base64_lshift,  base64_rshift好像就有输出了
  1. ./base64.sh Hello
  2. Hello

  3. Base64 encoded: SGVsbG8=World

  4. Base64 encoded: SGVsbG8=V29ybGQ=Magic

  5. Base64 encoded: SGVsbG8=V29ybGQ=TWFnaWM=
复制代码
不理解base64算法,不知道结果对不对。
测试环境:CentOS release 6.4   GNU Awk 3.1.7






   

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
2 [报告]
发表于 2013-12-26 10:44 |显示全部楼层
回复 15# bikkuri
好像确实有这个问题
CentOS6.4
  1. echo -e "Hello\0World"|awk '1'

  2. HelloWorld
复制代码
Solaris 5.10
  1. echo -e "Hello\0World"|/usr/xpg4/bin/awk '1'

  2. Hello
复制代码
gawk和nawk的区别?

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
3 [报告]
发表于 2013-12-26 12:00 |显示全部楼层
回复 14# bikkuri

找了一上午,没找到怎么忽略输入中的\0的。
楼主看一一下下面这段,gawk外的其他awk
都是以\0为结束的。


Advanced Notes: RS = "\0" Is Not Portable

There are times when you might want to treat an entire data file as a single record. The only way to make this happen is to give RS a value that you know doesn't occur in the input file. This is hard to do in a general way, such that a program always works for arbitrary input files.

You might think that for text files, the NUL character, which consists of a character with all bits equal to zero, is a good value to use for RS in this case:

       

BEGIN { RS = "\0" }  # whole file becomes one record?

gawk in fact accepts this, and uses the NUL character for the record separator. However, this usage is not portable to other awk implementations.

All other awk implementations(15) store strings internally as C-style strings. C strings use the NUL character as the string terminator. In effect, this means that `RS = "\0"' is the same as `RS = ""'. (d.c.)


The best way to treat a whole file as a single record is to simply read the file in, one record at a time, concatenating each record onto the end of the previous ones.

   

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
4 [报告]
发表于 2013-12-27 11:55 |显示全部楼层
本帖最后由 Herowinter 于 2013-12-27 11:58 编辑

回复 22# bikkuri
awk本来就不是很适合处理2进制文件,
你可以参考一下这篇文章,
http://www.ibm.com/developerworks/cn/linux/shell/awk/binary/

试试类似这种行不行
  1. echo -e "Hello\0World"|od|./base64encode.sh
复制代码
我是完全看不懂出来的结果对不对。

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
5 [报告]
发表于 2013-12-27 13:29 |显示全部楼层
回复 24# bikkuri
目测的,不大确定行不行。
  1. cat a.gz|hexdump -C

  2. 00000000  1f 8b 08 08 02 0f bd 52  00 03 61 00 f3 48 cd c9  |.......R..a..H..|
  3. 00000010  c9 0f cf 2f ca 49 e1 02  00 07 b8 79 1b 0b 00 00  |.../.I.....y....|
  4. 00000020  00                                                |.|
  5. 00000021


  6. cat a.gz|hexdump -C|awk '{for(i=2;i<NF;i++)s=s$i}END{print s}'

  7. 1f8b0808020fbd5200036100f348cdc9c90fcf2fca49e1020007b8791b0b000000
复制代码

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
6 [报告]
发表于 2013-12-27 13:36 |显示全部楼层
回复 26# bikkuri
  1. cat a.gz|hexdump -C|awk '{for(i=2;i<NF;i++)s=s?s" "$i:$i}END{print s}'

  2. 1f 8b 08 08 02 0f bd 52 00 03 61 00 f3 48 cd c9 c9 0f cf 2f ca 49 e1 02 00 07 b8 79 1b 0b 00 00 00
复制代码

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
7 [报告]
发表于 2013-12-27 13:37 |显示全部楼层
回复 27# bikkuri
判断一下s是否非空再拼空格就没有第一个空格了。

   

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
8 [报告]
发表于 2013-12-30 10:22 |显示全部楼层
回复 31# bikkuri
我是参照那个样本数据写的代码,取得是2到NF-1这些字段,
可能处理实际数据,会有些偏差,可以加个正则判断每一个
$i是不是[0-9a-f]{2}就不会取到乱码了。
  1. echo "c4 0f 18 f8 |.(^=|. 61 1a e1"|awk --re-interval '{for(i=2;i<NF;i++)if($i~/[0-9a-f]{2}/)s=s?s" "$i:$i}END{print s}'

  2. 0f 18 f8 61 1a
复制代码

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
9 [报告]
发表于 2013-12-30 10:23 |显示全部楼层
回复 32# bikkuri
substr好像不影响$0,$1的吧,不理解。


   

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
10 [报告]
发表于 2013-12-31 09:30 |显示全部楼层
回复 39# damcool
精通规范的业内人士来了,咱们这种背景不熟
的遇到救星了。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP