先抛一个问题,话说/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",0×7e}’
C:
printf("%c\n",0×7E);
回到一开始的问题吧。用上面给的知识,已经足够得到一个像样但并不完美的结果。面对格式化的要求,首先想到用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=0×0101A8C0; echo $((a&255)).$((a>>8&255)).$((a>>16&255)).$((a>>24&255))
结果为 192.168.1.1
挖!原来bash支持位运算~
转载请注明出处:http://www.jiayii.com/bash-bit-opreation-and-shell-awk-c-format-output/
谢谢您的关注。 : @jiayisuse : jiayisuse#gmail.com


shell programming is a fascinating world~~~~
[Reply]
shell确实很灵活~
[Reply]