bash 基本技巧 - 2

整理汇总从网上、书上看到的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{}语句块输出。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值