Shell练习(36-40)-2019.1.11

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值