文章随机晒最新文章关照最多的

jiayi Rss

bash位运算及shell awk C格式化输出杂烩

| Posted in shell |

23

先抛一个问题,话说/proc/net/route中的ip地址是低位在前,高位在后的16进制数字,如0101A8C0 ,如何将其转化为192.168.1.1呢?
解决这个问题,先说些无聊的东西…
进制转换,所有的语句实现将DD转换为十进制数
    bash:shell的进制转换方法比较多,这里肯定列不全,只介绍几种常用的

        1. echo $((16#DD))
       
2. echo $((0xDD)) #此二种方法仅限于任意进制到十进制
        3. printf "%d\n" 0xDD
    awk:
        awk ‘BEGIN{printf "%d\n",0xDD}’
   
C:
        printf("%d\n,0xDD);

再补充些内容,数字到字符的转换,所有语句实现将相应数字转换为字符‘~‘
    bash:
        1. echo -e "\0176"
            echo -e "\x7e"  #十进制数到字符的转换方法,至今没有找到
        2. 很抱歉,printf没有找到此功能
    awk:
        awk ‘BEGIN{printf "%c\n",0x7e}’
    C:
        printf("%c\n",0x7E);

回到一开始的问题吧。用上面给的知识,已经足够得到一个像样但并不完美的结果。面对格式化的要求,首先想到用sed将0101A8C0格式化,然后printf转化为10进制,代码如下:
    printf "%d.%d.%d.%d\n" $(echo 0101A8C0 | sed ‘s/../ 0x&/g’)
    结果为 1.1.168.192

相信追求完美的你肯定不会对此满意吧。0101A8C0低位在前,高位在后,如何得到192.168.1.1呢?下面的代码应该会让你感到bash的强大。
    a=0x0101A8C0; echo $((a&255)).$((a>>8&255)).$((a>>16&255)).$((a>>24&255))
    结果为 192.168.1.1
挖!原来bash支持位运算~

Comments (23)

shell programming is a fascinating world~~~~

shell programming is a fascinating world~~~~

shell确实很灵活~

Write a comment

You must be logged in to post a comment.