免费注册 查看新帖 |

Chinaunix

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

[文本处理] 请帮我修改一个小程序-nvram记录的base64编码化 [复制链接]

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-02-19 13:01 |只看该作者 |倒序浏览
30可用积分
大家新年好!
我有一个问题向大家请教。
我想在Linux服务器上建立一个配置文件/home/enb/enb.nvram,保留一些信息,用于Linux服务器和无线基站之间的通信。
信息的保存格式为:
变量名=$(echo "$变量名"|gzip -c|base64|tr -d "\n")
例如对于下面的变量port_status:
  1. [enb@hp7 ~]$ echo "$port_status"
  2. Host                       Port         Status
  3. ----------------------------------------------
  4. shi                        55001        On
  5. yok                        55002        On
  6. edo                        55003        On
  7. tok                        55004        On
  8. enb24042@shanghai          64649        On
  9. enb74324@beijing           64650        On
  10. ----------------------------------------------
  11. hp8                        55000        Off
  12. enb43535@shanghai          64648        Off
  13. enb52526@beijing           64651        Off
  14. [enb@hp7 ~]$ echo "$port_status"|gzip -c|base64|tr -d "\n"
  15. H4sIAFEs5FQAA5WQwQrCMAxA7/2K/oDQpUmdtx29KfgFHW5rFVpZ68G/Fw+yTGxhuYU8Ho8cY8ry/5zjvJwu2eZnErtNI5LzBbkkUqr5LqcgXvFeQ4GhwzXWUM3QXLcit4YeUCF0ydkwOcvKDRo8rNE9asCuH/zNh0muUFIM3fgw92hrvYt5HD8VqElTIbj9YQkITKG44ewbz0lCPhMCAAA=
  16. [enb@hp7 ~]$
复制代码
则在配置文件enb.nvram中,应保留如下一行记录:
  1. port_status=H4sIAFEs5FQAA5WQwQrCMAxA7/2K/oDQpUmdtx29KfgFHW5rFVpZ68G/Fw+yTGxhuYU8Ho8cY8ry/5zjvJwu2eZnErtNI5LzBbkkUqr5LqcgXvFeQ4GhwzXWUM3QXLcit4YeUCF0ydkwOcvKDRo8rNE9asCuH/zNh0muUFIM3fgw92hrvYt5HD8VqElTIbj9YQkITKG44ewbz0lCPhMCAAA=
复制代码
又如,对于下面的变量A:
  1. [enb@hp7 ~]$ A="Hello World"
  2. [enb@hp7 ~]$ echo "$A"
  3. Hello World
  4. [enb@hp7 ~]$ echo "$A"|gzip -c|base64|tr -d "\n"
  5. H4sIAJUo5FQAA/NIzcnJVwjPL8pJ4QIA4+WVsAwAAAA=
  6. [enb@hp7 ~]$
复制代码
则在配置文件enb.nvram中,应保留如下一行记录:
  1. A=H4sIAJUo5FQAA/NIzcnJVwjPL8pJ4QIA4+WVsAwAAAA=
复制代码
要求nvram的处理脚本实现以下功能:
nvram show: 以明文方式显示所有变量名及值
nvram get 变量名: 以明文方式仅返回值
nvram set 变量名=值: 以密文方式保存变量名及值到配置文件,如果配置文件中已经有相同变量名的记录,则新值覆盖旧值
nvram unset 变量名: 从配置文件中删除该变量对应记录

例如,以下是希望达到的效果:
  1. [enb@hp7 ~]$ nvram show
  2. [enb@hp7 ~]$ show_port
  3. Host                       Port         Status
  4. ----------------------------------------------
  5. shi                        55001        On
  6. yok                        55002        On
  7. edo                        55003        On
  8. tok                        55004        On
  9. enb24042@shanghai          64649        On
  10. enb74324@beijing           64650        On
  11. ----------------------------------------------
  12. hp8                        55000        Off
  13. enb43535@shanghai          64648        Off
  14. enb52526@beijing           64651        Off
  15. [enb@hp7 ~]$ nvram set port_status="$(show_port)"
  16. [enb@hp7 ~]$ cat /home/enb/enb.nvram
  17. port_status=H4sIAFEs5FQAA5WQwQrCMAxA7/2K/oDQpUmdtx29KfgFHW5rFVpZ68G/Fw+yTGxhuYU8Ho8cY8ry/5zjvJwu2eZnErtNI5LzBbkkUqr5LqcgXvFeQ4GhwzXWUM3QXLcit4YeUCF0ydkwOcvKDRo8rNE9asCuH/zNh0muUFIM3fgw92hrvYt5HD8VqElTIbj9YQkITKG44ewbz0lCPhMCAAA=
  18. [enb@hp7 ~]$ nvram get port_status
  19. Host                       Port         Status
  20. ----------------------------------------------
  21. shi                        55001        On
  22. yok                        55002        On
  23. edo                        55003        On
  24. tok                        55004        On
  25. enb24042@shanghai          64649        On
  26. enb74324@beijing           64650        On
  27. ----------------------------------------------
  28. hp8                        55000        Off
  29. enb43535@shanghai          64648        Off
  30. enb52526@beijing           64651        Off
  31. [enb@hp7 ~]$ nvram show
  32. port_status=Host                       Port         Status
  33. ----------------------------------------------
  34. shi                        55001        On
  35. yok                        55002        On
  36. edo                        55003        On
  37. tok                        55004        On
  38. enb24042@shanghai          64649        On
  39. enb74324@beijing           64650        On
  40. ----------------------------------------------
  41. hp8                        55000        Off
  42. enb43535@shanghai          64648        Off
  43. enb52526@beijing           64651        Off
  44. [enb@hp7 ~]$ nvram unset port_status
  45. [enb@hp7 ~]$ nvram show
  46. [enb@hp7 ~]$ cat /home/enb/enb.nvram
  47. [enb@hp7 ~]$
复制代码
之前我没有考虑到用base64来编码变量的值,而是全部用明文来保存。
  1. nvram()
  2. {
  3. local file=/home/enb/enb.nvram
  4. case "$1" in
  5. show)
  6. cat $file
  7. ;;
  8. get)
  9. grep "^"$2"=" $file|cut -d= -f2
  10. ;;
  11. set)
  12. item=$(echo $2|cut -d= -f1)
  13. sed -i "/^$item\=/d" $file
  14. echo "$2" >> $file
  15. ;;
  16. unset)
  17. item=$(echo $2|cut -d= -f1)
  18. sed -i "/^$item\=/d" $file
  19. ;;
  20. *)
  21. echo "Parameter error"
  22. esac
  23. }
复制代码
后来发现值可能不止一行,而且可能含有和变量名一样的字符串,甚至可能含有等号=,这就会出现很多意外的结果。
因此希望把值的部分用base64编码后保存,这样可以保持值在配置文件中的格式统一,而输出可以保持原有格式不变。

谢谢大家。

最佳答案

查看完整内容

nvram(){ local file=~/SoftwareFactory/shellExercises/enb/enb.nvram; case "$1" in show) awk '{printf("%s=",$1);system("echo " $2 "|base64 -d|gzip -cd");}' "$file"; ;; get) awk -v s2="$2" '$1==s2{system("echo " $2 "|base64 -d|gzip -cd");}' "$file"; ;; set) item="${2%%=*}"; value=$(echo "${2#*=}"|gzip -c|base64|tr -d '\n'); awk -v item="$item" -v value="$value" -v fi ...

论坛徽章:
2
2015年亚洲杯之日本
日期:2015-02-18 15:57:052015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2015-02-19 13:01 |只看该作者
nvram(){
    local file=~/SoftwareFactory/shellExercises/enb/enb.nvram;
    case "$1" in
        show)
            awk '{printf("%s=",$1);system("echo " $2 "|base64 -d|gzip -cd");}' "$file";
            ;;
        get)
            awk -v s2="$2" '$1==s2{system("echo " $2 "|base64 -d|gzip -cd");}' "$file";
            ;;
        set)
            item="${2%%=*}";
            value=$(echo "${2#*=}"|gzip -c|base64|tr -d '\n');
            awk -v item="$item" -v value="$value" -v file="$file" '$1!=item{printf("%s\n",$0)>file;} END{printf("%s%s%s\n",item,FS,value)>file;}' "$file";
            ;;
        unset)
            item="${2%%=*}";
            awk -v item="$item" -v file="$file" '$1!=item{print $0>file;}' "$file";
            ;;
        *)
            echo "Parameter error";
    esac
}

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
3 [报告]
发表于 2015-02-21 20:02 |只看该作者
本帖最后由 bikkuri 于 2015-02-22 11:08 编辑

自己改了一下,基本实现了功能,感觉写得比较笨,看看有那位大神可以用awk实现。
  1. #! /bin/bash
  2. nvram()
  3. {
  4.         local file=/home/enb/enb.nvram
  5.         payload=$2
  6.         if [ $(echo $payload|grep -c "=") -gt 0 ]; then
  7.                 item="${payload%%=*}"
  8.                 value="${payload#*=}"
  9.         else
  10.                 item="$payload"
  11.         fi
  12.         case "$1" in
  13.         show)
  14.                 cat $file| while read -r payload
  15.                 do
  16.                         item="${payload%%=*}"
  17.                         rec_value="${payload#*=}"
  18.                         value="$(echo $rec_value|base64 -d |gzip -cd)"
  19.                         echo -ne "$item=$value\n"
  20.                 done
  21.         ;;
  22.         get)
  23.                 record=$(grep "^$item=" $file)
  24.                 rec_value=${record#*=}
  25.                 echo "$(echo $rec_value|base64 -d|gzip -cd)"
  26.         ;;
  27.         set)
  28.                 sed -i "/^$item\=/d" $file
  29.                 rec_value=$(echo "$value"|gzip -c|base64|tr -d '\n')
  30.                 echo -ne "$item=$rec_value\n" >> $file
  31.         ;;
  32.         unset)
  33.                 sed -i "/^$item\=/d" $file
  34.         ;;
  35.         *)
  36.         echo "Parameter error"
  37.         esac
  38. }
  39. nvram "$1" "$2"
复制代码
谢谢。

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
4 [报告]
发表于 2015-02-22 10:48 |只看该作者
一看到没有缩进的代码就头疼

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
5 [报告]
发表于 2015-02-22 11:11 |只看该作者
我的代码确实很业余,谢谢您的意见。
回复 3# Shell_HAT


   

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
6 [报告]
发表于 2015-03-17 12:51 |只看该作者
谢谢您的回复。

回复 2# swz2015


   

论坛徽章:
2
2015年亚洲杯之日本
日期:2015-02-18 15:57:052015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2015-03-17 13:00 |只看该作者
回复 6# bikkuri


    不客气。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP