好玩的shell脚本

字数 278阅读 281

我的总结记录文档: https://github.com/jinboxu/Shell_notes.git

1. 获取随机的字符串和数字

#!/usr/bin/bash
#获取随机8位字符串或数字

par=$*

echo $par
if [ "$par" == "s" ];then
        s=`echo $RANDOM|md5sum |cut -c 1-8`
        echo "随机的8位字符串为: $s"
elif [ "$par" == "n" ];then
        n=`echo $RANDOM|cksum |cut -c 1-8`
        echo "随机的8位数字为: $n"
else
        echo "error command";exit 1
fi

其他获得随机数的方法:https://www.jb51.net/article/57949.htm

2.批量创建用户

#!/usr/bin/bash
#批量创建和删除用户

while true    #循环打印select的菜单,否则只在第一次进入select循环的时候打印(注意:在select中直接回车也可以打印)
do
        select choice in create del      #交互阶段,循环给choice变量赋值
#!/usr/bin/bash
#批量创建和删除用户

while true    #循环打印select的菜单,否则只在第一次进入select循环的时候打印(注意:在select中直接回车也可以打印)
do
        select choice in create del      #交互阶段,循环给choice变量赋值
        do
                case $choice in
                create)
                        echo "create"
                        read -p "username: " username
                        read -p "number: " numb
                        for((i=1;i<=$numb;i++))
                        do
                                user=$username$i;echo "$user"
                                useradd $user > /dev/null
                                if  [ $? == 0 ];then
                                        echo "$user created!"
                                else
                                        echo "$user is exited!!!"
                                fi
                        done
                        break       #调到while循环下,打印菜单
                ;;
                del)
                        echo "del" 
                        read -p "用户名前缀: " user_head
                        awk -F: '/^'"$user_head"'[0-9]+:/{print $1}' /etc/passwd |xargs -n 1 userdel > /dev/null
                        if  [ $? == 0 ];then
                                echo "所有以$user_head开始的用户已被删除"
                        else
                                echo "没有以$user_head开始的用户"
                        fi
                        break
                ;;
                *)
                        echo "nothing"
                        break
                ;;
                esac
        done
done

3.统计QQ号和电话的绑定关系

[root@localhost jianshu]# cat qq.txt 
11235334: 13443253456

11235335: 13443253457

11235336: 13443253458

11235333: 13443253458

11235336: 13443253459

11235334: 13443253452

方法一:

#!/usr/bin/bash
#统计每个QQ绑定了几个手机

declare -A qq_tel
while read line
do
        #echo "$line"
        if [ "$line" = "" ];then
                continue
        fi
        qqtmp=`echo $line | awk '{print $1}'`
        qq=`echo "${qqtmp::-1}"`
        #tel=`echo "$line" | awk  '{print $2}'`;echo "$tel"
        let qq_tel[$qq]++
done < /root/scripts/jianshu/qq.txt

for i in ${!qq_tel[@]}
do
        echo $i,${qq_tel[$i]}
done

方法二:

[root@localhost jianshu]# awk 'BEGIN{FS="[[:space:]:]+"} {print $1,$2}' qq.txt | awk '{qq_tel[$1]++} END{for(i in qq_tel) {print i,qq_tel[i]}}'
 5
11235333 1
11235334 2
11235335 1
11235336 2
[root@localhost jianshu]# awk 'BEGIN{FS="[[:space:]:]+"} {print $1,$2}' qq.txt | awk '{qq_tel[$1]++} END{for(i in qq_tel) {print i,qq_tel[i]}}' |grep -v '^ '
11235333 1
11235334 2
11235335 1
11235336 2

4.三次机会判断主机是否存活

#!/usr/bin/bash
#ping三次判断主机的存活状态,如果有一次ping通即为alived

IP_LIST="192.168.181.129 192.168.181.130 192.168.181.131"

for ip in $IP_LIST
do
        for((i=1;i<=3;i++))
        do
                ping -c1 -w1 $ip &> /dev/null
                if [ $? -eq 0 ];then
                        echo "$ip is up."
                        break
                fi
                if [ $i -eq 3 ];then
                        echo "$ip is down!!!"
                fi
        done
done

看到有些资料上还额外定义了一个count变量和数组来统计错误的次数,我觉得完全没有必要。

5.分析nginx日志

统计2017年9月15日每个IP状态码的数量

[root@localhost ~]# awk '/05\/Sep\/2017/{ip_code[$1" "$9]++} \
END{for(i in ip_code) {print i,ip_code[i]}}' access.log |sort -k1rn | head

//将IP+状态码作为索引(统计谁就将其作为索引),此时有重复的IP,所以以第一列来排序

统计2017年9月15日,IP访问状态码为404及出现的次数

[root@localhost ~]# awk '/05\/Sep\/2017/{if($9=="404") {ip_code[$1" "$9]++}} \
> END{for(i in ip_code) {print i,ip_code[i]}}' access.log |sort -k3rn | head

统计前一分钟的pv量

[root@localhost ~]# date
Sun Feb 17 12:55:30 EST 2019
[root@localhost ~]# date -d '-1 minute' +%d/%b/%Y:%H:%M
17/Feb/2019:12:54
[root@localhost ~]# date=$(date -d '-1 minute' +%d/%b/%Y:%H:%M);awk -v date=$date \
> '$0 ~ date{i++} END{print i}' access.log

访问 2017年9月5日 8:30 - 9:00,访问状态码是404

  • 状态码为404的行列出来
[root@localhost ~]# awk '$4>="[05/Sep/2017:08:30:00" && $4<="[05/Sep/2017:09:00:00" {if{$9=="404"} {print $0}}' access.log
  • 打印IP状态码为404的数量
[root@localhost ~]# awk '$4>="[05/Sep/2017:08:30:00" && $4<="[05/Sep/2017:09:00:00" {if{$9=="404"} {ip_code[$1" "$9]++}} \
> END{for(i in ip_code) {print i,ip_code[i]}}' access.log

统计2017年9月5日 各种状态码数量

[root@localhost ~]# awk '/05\/Sep\/2017/{code[$9]++} END{for(i in code) {print i,code[i]}}' access.log

推荐阅读更多精彩内容