整理汇总从网上、书上看到的bash脚本的基本技巧,实验记录。
1. shell 拆分字符串,split 功能
string="1,2,3,4,5,6"
arrs=(${string//,/ }) # /,/ 用空格替换,
for arr in ${arrs[@]}; do
echo $arr
done
2. 提取网卡的IP 地址和掩码
用ifconfig 、grep和上述的字符串分割方法,就比较容易了。
ifconfig的输出
oliver@OLG480:~$
oliver@OLG480:~$ ifconfig lo
lo Link encap:本地环回
inet 地址:127.0.0.1 掩码:255.0.0.0
inet6 地址: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 跃点数:1
接收数据包:18724 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:18724 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1
接收字节:2731711 (2.7 MB) 发送字节:2731711 (2.7 MB)
oliver@OLG480:~$
提取IP和NETMASK的脚本
oliver@OLG480:~$ device='lo'
oliver@OLG480:~$ result=$(ifconfig ${device} |grep 'inet ')
oliver@OLG480:~$ result=(${result//:/ })
oliver@OLG480:~$ IP=${result[2]}
oliver@OLG480:~$ NETMASK=${result[4]}
oliver@OLG480:~$ echo $IP
127.0.0.1
oliver@OLG480:~$ echo $NETMASK
255.0.0.0
oliver@OLG480:~$
3. shell 浮点数计算和比较
bc 实现 ,通过管道把表达式作为bc的输入
a=0.31
b=0.6
if [[ $( echo "$a > $b" |bc ) == 1 ]]; then
echo "True";
else
echo "False";
fi
echo "$a + $b" |bc
awk 实现。用awk有时更实用,如把uptim获取的值转换为1和0, 1表示超限值了。这个例子先用sed替换跟在数据后面的逗号。
oliver@OLG480:~$ uptime | sed 's/[,][,]*/ /g'
22:49:12 up 2:04 1 user load average: 0.28 0.41 0.45
oliver@OLG480:~$
oliver@OLG480:~$ THRESHOLD=0.5
oliver@OLG480:~$ uptime | sed 's/[,][,]*/ /g'|awk -v parm01=$THRESHOLD '{print($9>=parm01)?"1":"0"}'
0
oliver@OLG480:~$ THRESHOLD=0.3
oliver@OLG480:~$ uptime | sed 's/[,][,]*/ /g'|awk -v parm01=$THRESHOLD '{print($9>=parm01)?"1":"0"}'
1
oliver@OLG480:~$
转换多个值
oliver@OLG480:~$ res=$(uptime | sed 's/[,][,]*/ /g'|awk -v parm01=$THRESHOLD '{print($9>=parm01)?"1":"0"; print($10>=parm01)?"1":"0"; }')
oliver@OLG480:~$ echo $res
0 0
oliver@OLG480:~$
4. 找出目录下大于100M的文件
有了上面的基础,这个问题就简单了。用ls -l 获得信息,用awk处理。脚本如下:
size=$(echo '100*1024*1024' | bc)
files=$(ls -l | awk -v parm01=$size '$5>parm01 {print $9}')
for file in $files; do
echo $file
done
5 . awk 分组求和、求平均
原始数据文件1.txt
A 10
B 12
C 9
A 11
B 6
C 12
A 9
B 9
C 6.6
awk 脚本
awk '{t[$1]=t[$1]+$2; n[$1]=n[$1]+1} END{ print "id sum avg"; for (i in t) print i, t[i], t[i]/n[i]}' 1.txt
处理后的输出
id sum avg
A 30 10
B 27 9
C 27.6 9.2
脚本说明
awk 的命令行方式:awk [-F field-separator] 'commands' input-file(s) 。awk读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键"。这个例子用到了awk的关联数组,关联数组有点像是java里的map和python里的字典。例子中以$1第页列作为key,执行两个动作,分组计数和求和,从而求平均值。处理完所有行以后,最后在END{}语句块输出。