基于网传的shell脚本优化
0人
2021-10-01
第一题,文本格式化:
请把下面的字符串:
zhangsany97JbzPru lisi 5JhvCls6q xiaowang Nnr8qt2Ma laoma iqMtvC02y zhaosi 9fxrb4sJD
改为如下:
zhangsan:y97JbzPru lisi:5JhvCls6q xiaowang:Nnr8qt2Ma laoma:iqMtvC02y zhaosi:9fxrb4sJD
原参考答案:
#!/bin/bash #这个脚本用来格式化文本 #作者:**** #日期:2018-12-19 n=`wc -l test3.txt|awk '{print $1}'` n2=$[$n/2] for i in `seq 1 $n2` do i2=$[$i*2] j=$[$i2-1] l1=`sed -n "$i2"p test3.txt` l2=`sed -n "$j"p test3.txt` echo $l2:$l1 done
优化后:
[root@localhost ~]# sed 'N;s/\n/:/' test zhangsan:y97JbzPru lisi:5JhvCls6q xiaowang:Nnr8qt2Ma laoma:iqMtvC02y zhaosi:9fxrb4sJD
第二题,批量修改文件名:
至少用两种方法,批量把当前目录下面所有文件名后缀为.bak的后缀去掉,比如1.txt.bak去掉后为1.txt
原参考答案:
#!/bin/bash #这个脚本用来去掉文件名后缀 #作者:*** #日期:2018-12-14 for f in `ls -d ./*.bak `do # mv $f `echo $f|sed 's/.bak$//'` f1=`echo $f|awk -F '.bak$' '{print $1}' ` mv $f $f1done
优化后:
[root@localhost ~]# ll 总用量 0 -rw-r--r-- 1 root root 0 6月 26 11:29 1.txt.bak -rw-r--r-- 1 root root 0 6月 26 11:29 2.txt.bak -rw-r--r-- 1 root root 0 6月 26 11:29 3.txt.bak -rw-r--r-- 1 root root 0 6月 26 11:29 4.txt.bak -rw-r--r-- 1 root root 0 6月 26 11:29 5.txt.bak -rw-r--r-- 1 root root 0 6月 26 11:29 6.txt.bak -rw-r--r-- 1 root root 0 6月 26 11:29 7.txt.bak -rw-r--r-- 1 root root 0 6月 26 11:29 8.txt.bak -rw-r--r-- 1 root root 0 6月 26 11:29 9.txt.bak [root@localhost ~]# rename .txt.bak .txt * [root@localhost ~]# ll总用量 0 -rw-r--r-- 1 root root 0 6月 26 11:29 1.txt -rw-r--r-- 1 root root 0 6月 26 11:29 2.txt -rw-r--r-- 1 root root 0 6月 26 11:29 3.txt -rw-r--r-- 1 root root 0 6月 26 11:29 4.txt -rw-r--r-- 1 root root 0 6月 26 11:29 5.txt -rw-r--r-- 1 root root 0 6月 26 11:29 6.txt -rw-r--r-- 1 root root 0 6月 26 11:29 7.txt -rw-r--r-- 1 root root 0 6月 26 11:29 8.txt -rw-r--r-- 1 root root 0 6月 26 11:29 9.txt
第三题,打印数组:
写一个脚本让用户输入多个城市的名字(可以是中文),要求不少于5个,然后把这些城市存到一个数组里,最后用for循环把它们打印出来。
原参考答案:
#!/bin/bash #这个脚本用来打印城市名字#作者:*** #日期:2018-12-12 read -p "输入不少于5个城市的名字,用空格分隔开。" name n=`echo $name|awk '{print NF}'` if [ $n -lt 5 ] then echo "请输入至少5个城市的名字." exit fi city=($name) for i in `seq 0 $[${#city[@]}-1]` do echo ${city[$i]} done
优化后:
#!/bin/bashread -p "输入不少于5个城市的名字,用空格分隔开: " -a name n=`echo $name|awk '{print NF}'` if [ `echo ${#name[@]}` -lt 5 ] then echo "请输入至少5个城市的名字." exit fi for i in `seq 0 $[${#name[@]}-1]` do echo ${name[$i]} done
第四题,判断某网站是否宕机:
写一个shell脚本,通过curl -I 返回的状态码来判定所访问的网站是否正常。 比如,当状态码为200时,才算正常。
原参考答案:
#!/bin/bash #这个脚本用来判断一个网址是否正常 #作者:*****#日期:2018-11-01 url="http://www.jd.com" mail_user=3067986**@qq.com code=`curl -I $url 2>/tmp/curl.err|head -1|awk '{print $2}'` if [ -z "$code" ] then python mail.py $mail_user "$url访问异常" "`cat /tmp/curl.err`" exit elif [ $code != "200" ] then curl -I $url &> /tmp/curl.log python mail.py $mail_user "$url访问异常 状态码$code" "`/tmp/curl.log`" fi
优化后:
#!/bin/bashurl=" code=`curl -ILs $url |awk '/HTTP/{print $2}'| grep -w "200"` if [ $? -ne 0 ];then echo "站点异常!" #如果想发邮件通知: #echo "站点:$url 异常,请检查!" | mailx -s "warning" username@163.com fi
第五题,检查某网站在线的主机:
写一个shell脚本,把192.168.75.0/24网段在线的ip列出来。
原参考答案:
#!/bin/bash for i in `seq 1 254` do if ping -c 2 -W 2 192.168.75.$i >/dev/null 2>/dev/null then echo "192.168.75.$i 是通的." else echo "192.168.75.$i 不通." fi done
优化后:
fping -ag 192.168.75.0/24 2>/dev/null