36.一个数字的行
需求:
- 用shell实现,把一个文本文档中只有一个数字的行给打印出来
核心要点:
- 用sed替换所有非数字的字符为空,剩下的就是数字
[root@Chauncey ~]# cat 36.sh
#!/bin/bash
while read line
do
n=`echo $line |sed 's/[^0-9]'//g|wc -L`
if [ $n -eq 1 ]
then
echo $line
fi
done < test.txt
[root@Chauncey ~]# sh 36.sh
1jieljinve
37.日志切割归档
需求:
- 系统logrotate工具,可以完成日志切割、归档。写一个shell脚本实现类似的归档宫鞥你
- 加入服务器输出的日志是1.log,要求每天归档一个,1.log第二天变成1.log.1,第三天变成1.log.2,第四天1.log.3,一直到1.log.5
核心要点:
- mv改名字
- 改完名字还要重新加载服务生成新的日志
[root@Chauncey ~]# cat 37.sh
#!/bin/bash
cd /data/logs
log =1.log
mv_log()
{
[ -f $1 ] && mv $1 $2
}
[ -f 1.log5 ] && rm -f 1.log.5
for i in `seq 4 -1 1 `
do
j=$[$i+1]
mv_log $log.$i $log.$j
done
mv 1.log 1.log.1
[root@Chauncey ~]#
38.查找在线IP
需求:
- 写一个shell脚本,把192.168.0.0/24网段在线的ip列出来
核心要点:
- for循环遍历所有的IP
- 看ip是否可以ping通
#################个人实验##################
[root@Chauncey ~]# cat 38.sh
#!/bin/basn
for i in `seq 1 254`
do
m=`ping -c 4 "192.168.0.$i" |grep 'packets'|awk -F ',' '{print $3}'|awk '{print $1}'|awk -F '%' '{print $1}'`
if [ "$m" == 0 ]
then
echo "192.168.0.$i在线"
fi
done
#################实验结果################
++ seq 1 254
+ for i in '`seq 1 254`'
++ awk '{print $1}'
++ awk -F % '{print $1}'
++ awk -F , '{print $3}'
++ grep packets
++ ping -c 4 192.168.0.1
+ m=100
+ '[' 100 == 0 ']'
+ for i in '`seq 1 254`'
++ awk '{print $1}'
++ awk -F % '{print $1}'
++ awk -F , '{print $3}'
++ grep packets
++ ping -c 4 192.168.0.2
+ m=100
+ '[' 100 == 0 ']'
+ for i in '`seq 1 254`'
++ awk '{print $1}'
++ awk -F % '{print $1}'
++ awk -F , '{print $3}'
++ grep packets
++ ping -c 4 192.168.0.3
....
#########################标准写法##############################
[root@Chauncey ~]# cat 38_1.sh
#!/bin/bash
for i in `seq 1 254`
do
if ping -c 2 -W 2 192.168.0.$1 >/dev/null 2>/dev/null ###-W timeout
then
echo "192.168.0.$i 是通的"
else
echo “192.168.0.$i 不通”
done
39.检查脚本语法错误
需求:
- 写一个脚本,检查指定的shell脚本是否有语法错误,若有错误,首先显示错误信息,然后提示用户输入q或者Q退出脚本,输入其他内容则直接使用vim打开该脚本
核心要点:
- sh -n
####################个人实验###############
[root@Chauncey ~]# cat 39.sh
#!/bin/bash
sh -n $1 2>/tmp/sh.err
n=`cat sh.err| grep 'error'`
if [ -z $n ]
then
echo “脚本正确”
else
cat /tmp/sh.err
read -p "是否推出脚本(q|Q):" i
if [ "$i" == "q" ] || [ "$i" == "Q" ]
then
exit
else
vim $1
fi
fi
###################实验结果#####################
[root@Chauncey ~]# sh -x 39.sh 38.sh
+ sh -n 38.sh
++ grep error
++ cat /tmp/sh.err
+ n='38.sh: line 12: syntax error near unexpected token `done'\'''
+ '[' -z 38.sh: line 12: syntax error near unexpected token '`done'\''' ']'
39.sh: line 4: [: too many arguments
+ cat /tmp/sh.err
38.sh: line 12: syntax error near unexpected token `done'
38.sh: line 12: `done'
+ read -p '是否推出脚本(q|Q):' i
是否推出脚本(q|Q):
+ '[' '' == q ']'
+ '[' '' == Q ']'
+ vim 38.sh
[root@Chauncey ~]# sh 39.sh 37.sh
“脚本正确”
####################参考写法####################
#!/bin/bash
sh -n $1 2 > /tmp/sh.err
if [ $? -ne 0 ]
then
cat /tmp/sh.err
read -p "请输入q/Q退出脚本。" c
if [ -z "$c" ]
then
vim $1
exit 0
fi
if [ $c ==q ] || [ $c == 0]
then
exit 0
else
vim $1
exit 0
fi
else
echo "脚本$1没有语法错误"
fi
- 40.格式化数字
需求:
- 输入一串随机数字,然后按千分位输出
- 比如输入的数字串为“123456789”,输出为123,456,789。
核心要点:
- 遍历所有的数字,每个数字一行存入临时文件
[root@Chauncey ~]# cat 40.sh
#!/bin/bash
n=`echo $1 |wc -L`
for d in `echo $1|sed 's/./& /g'` #.代表数字,&表示前边的.后边加空格,就可以字符之间输出空格
do
n2=$[$n%3]
if [ $n2 -eq 0 ]
then
echo -n ",$d" #echo -n,不打印换行符
else
echo -n "$d"
fi
n=$[$n-1]
done |sed 's/^,//'
echo