sed c\命令,IP地址和16进制数互相转换等一些精彩shell代码

来源:互联网 发布:云计算在企业中的应用 编辑:程序博客网 时间:2024/06/15 04:16
1. 首先是sed中的c\命令,这个命令和s/xxx/xxxx/g不同的是,使用c\能把当前sed查找到的一行全部替换成我们指定的TEXT 

比如 sed -i "/734/c\Hello" install.log ,这样就把包含有734这样字符串的整个一行替换成了Hello 

在使用c\的时候需要注意,如果我们在c\命令后面加的不是一个常数字符串,而是一个变量,那么,要再加一个\符号来解引用,否则变量无法正常解析: 

sed -i "/734/c\$Hello" install.log -- 含有734的一行被替换成了$Hello 

sed -i "/734/c\\$Hello" install.log -- 含有734的一行被替换成了Hello变量中的值 

2. 几个不错的函数,分别是ip转成十六进制,十六进数字转成IP地址,判断两个IP的大小,在一堆IP地址中找出最小的IP和最大的IP,这里面都用到了一个命令printf,这个东西还不错,可以用来格式化输出,下面代码中出现的printf "%08X" ...... 表示将后面的内容格式化成十六进制数,最多保留8位 
iptohex() {
    IFS
=.
    
for str in $1
    
do
        
printf "%02X" $str
    done
}

hextoip() {
    
hex=$1
    
printf "%d." 0x${hex:0:2}
    
printf "%d." 0x${hex:2:2}
    
printf "%d." 0x${hex:4:2}
    
printf "%d" 0x${hex:6:2}
}

iplarger() {
    first
=0x$(iptohex $1)
    second
=0x$(iptohex $2)
    first
=$(printf "%d" $first)
    second
=$(printf "%d" $second)
    
if [ $first -gt $second ];then
        
return 0
    
else
        
return 1
    fi
}

ipsmaller() {
    first
=0x$(iptohex $1)
    second
=0x$(iptohex $2)
    first
=$(printf "%d" $first)
    second
=$(printf "%d" $second)
    
if [ $first -lt $second ];then
        
return 0
    
else
        
return 1
    fi
}

 

 

 在一堆IP地址中找出最小的和最大的IP(IPADDRESS是一个数组):

 

ip_low=${IPADDRESS[1]}
ip_high
=$ip_low
for ipnow in ${IPADDRESS[@]}
do
    
if ismasked $ipnow $localip $localmask
    then
        
if ipsmaller $ipnow $ip_low
        then
            ip_low
=$ipnow
        fi
        
if iplarger $ipnow $ip_high
        then
            ip_high
=$ipnow
        fi
    
else
        echo IPs not mask
        
exit
    fi
done