加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

regex – bash:oneliner将输出中的十六进制数转换为小数

发布时间:2020-12-16 01:49:54 所属栏目:安全 来源:网络整理
导读:有没有人知道一个oneliner,一些输出可以在bash中输入,匹配和转换所有出现的十六进制数字,并保持所有其他文本不变? 也许匹配相当任意的输出,可能是十六进制 应以某种方式通过正则表达式转换,即 /(0X)?[0-9A-FA-F] {5,} / 前导0x不是必需的,但是 也要妥善处
有没有人知道一个oneliner,一些输出可以在bash中输入,匹配和转换所有出现的十六进制数字,并保持所有其他文本不变?

>也许匹配相当任意的输出,可能是十六进制
应以某种方式通过正则表达式转换,即
/(0X)?[0-9A-FA-F] {5,} /
>前导0x不是必需的,但是
也要妥善处理
>如果没有,可能会出现误报
指定数字的最小长度,但不应该是
问题
>目标是找到可以与尽可能多的输出一起使用的解决方案,其中包含十六进制数字

它应该在输出上工作,如:

ssg sjas # cat /proc/net/stat/arp_cache | column -t 
entries   allocs    destroys  hash_grows  lookups   hits      res_failed  rcv_probes_mcast  rcv_probes_ucast  periodic_gc_runs  forced_gc_runs  unresolved_discards  table_fulls
0000000d  00000006  00000004  00000000    0000c3b9  0000c35e  00000000    00000000          00000000          0000965b          00000000        00000000             00000000
0000000d  0000000d  00000004  00000001    00000000  00000000  00000000    00000000          00000000          000007cd          00000000        00000000             00000000
0000000d  00000008  00000008  00000001    00000000  00000000  00000000    00000000          00000000          000006e0          00000000        00000000             00000000
0000000d  0000000a  00000008  00000000    00000000  00000000  00000002    00000000          00000000          00000704          00000000        00000000             00000000

stackoverflow上的大多数其他问题仅解决了如何在数字系统之间转换单个数字的问题,仅针对指定列进行转换或完全终止输入中存在的格式.

期望的输出应该如下所示:(列-t无论如何,它实际上只需要替换它可以找到的十六进制值,并且向printf语句添加前导零也不是问题)

ssg sjas # cat /proc/net/stat/arp_cache | perl -pe 's/(?:0x)?[0-9a-f]{5,}/hex($&)/ge' | column -t
entries  allocs  destroys  hash_grows  lookups  hits   res_failed  rcv_probes_mcast  rcv_probes_ucast  periodic_gc_runs  forced_gc_runs  unresolved_discards  table_fulls
13       6       4         0           50105    50014  0           0                 0                 38491             0               0                    0
13       13      4         1           0        0      0           0                 0                 1997              0               0                    0
13       8       8         1           0        0      0           0                 0                 1760              0               0                    0
13       10      8         0           0        0      2           0                 0                 1796              0               0                    0

在过去的两个小时里,我无法通过sed / awk / perl找到一个简短可行/可靠的解决方案,所以我来到这里寻求帮助.

解决方法

perl使用e标志替换

perl -pe 's/(0x)?[0-9a-f]{5,}/hex $&/ge' file | column -t

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读