shell—100实例(70)

实例六十一:【破解字符串】

需求:已知下面的字符串是通过RANDOM随机数变量md5sum|cut -c 1-8 截取后的结果,请破解这些字符串对应的md5sum前的RANDOM对应数字?

21029299

00205d1c

a3da1677

1f6d12dd

890684ba

提示:

1、$RANDOM的范围是0-32767,想要破解此题,需要遍历0-32767所有数字,逐一和题目中给出的字符串匹配。

#!/bin/bash
#破解字符串
#
declare -i first=0
echo -e "21029299\n00205d1c\na3da1677\n1f6d12dd\n890684ba" >tmp1.txt
for item in {0..32767}
do
        ziduan=`echo "$item"|md5sum|cut -c 1-8`
        grep -w "$ziduan" tmp1.txt &>/dev/null
        if [ $? -eq 0 ];then
                echo "字段$ziduan 对应的数字为:$item"
                first=$[$first+1]
                if [ $first -eq 5 ];then
                        echo "查找完成!"
                        exit 0
                fi
        fi
done
rm -f tmp1.txt

脚本解析:

1、declare -i first=0 >声明一个初始值目的是for循环找到5个目标字段即停止,每找到一个就增加1

2、echo -e "21029299\n00205d1c\na3da1677\n1f6d12dd\n890684ba" >tmp1.txt  >"-e"选项是解析echo输出中的特殊符号

3、grep -w "$ziduan" tmp1.txt &>/dev/null  >精确匹配文档tmp1.txt是否有$ziduan

 

实例六十二:【判断CPU厂商】

需求:1、判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor_id一行中

2、如果其生产商为AuthenticAMD,就显示其为AMD公司;

3、如果其生产商为GenuineIntel,就显示其为Intel公司

4、否则,就说其为非主流公司

#!/bin/bash
#判断CPU厂商
#
changshang=`cat /proc/cpuinfo |grep "vendor"|awk -F: '{print $2}'`
if [ $changshang = "GenuineIntel" ];then
        echo "Intel公司"
elif [ $changshang = "AuthenticAMD" ];then
        echo "AMD公司"
else
        echo "非主流"
fi

 

 脚本解析:无

 

实例六十三:【监控CPU使用率】

需求:用shell写一个监控服务器cpu使用率的监控脚本

提示:

1、用top -bn1 命令,取当前空闲cpu百分比值(只取整数部分),然后用100去减这个数值。

#/bin/bash
#获取服务器CPU使用值
#
while :
do
 
        cpu_i=`top -bn1 |grep 'Cpu(s):'|awk -F ' +|%' '{print $8}'`
        cpu_u=`echo 100-$cpu_i|bc`
 
        if [ $cpu_u gt 90 ]
        then
                python mail.py xxx@xxx.com "CPU使用率偏高" "`top -bn1`"
        fi
 
        sleep 10
done

脚本解析:

1、awk -F ' +|%' '{print $8}' >此命令是将从管道传过来的每一行内容,使用空格' '或者'%'进行分割,分割后取第8个字段;此字段即为CPU的空闲率

 

实例六十四:【简易计算器】

需求:用shell写一个简易计算器,可以实现加、减、乘、除运算,加入脚本名字为1.sh,执行示例:./1.sh 1 + 2

要求:

1、脚本有三个参数,所以第一要判断用户输入的参数个数是否符号要求

2、第一个第三个参数是数字,可以是小数,但不能是负数,第二个参数只能是+、-、*、/、如果是其他要报错

if [ $# -ne 3 ]
then
        echo "你输出的参数个数不对,应该给3个参数"
        exit
fi
 
if_number()
{
        n1=`echo $1|sed 's/[0-9.]//g'`
        if [ -n "$n1" ]
        then
                echo "$1不是数字"
                exit
        fi
 
        if echo $1|grep -q '^\.'
        then
                echo "数字$1不合法"
                exit
        fi
}
 
if_number $1
if_number $3
 
case $2 in
        +)
                echo "$1+$3"|bc
                ;;
        -)
                echo "$1-$3"|bc
                ;;
        \*)
                echo "$1*$3"|bc
                ;;
        /)
                echo "scale=2;$1/$3"|bc
                ;;
        *)
                echo "你给出的格式不对,第二个参数只能是+,-,*,/"
                ;;
esac

 脚本解析:

1、$# -ne 3 >判断参数的个数是否为3

2、if_number() >创建一个函数,用于判断参数是否为数字

3、使用case语句来选择四则运算的符号

 

六十五:【判断文件并计算单词】

需求:1、判断所给目录内那些二级目录下没有test.txt文件。

2、有test.txt文件的二级目录,计算出该test.txt文件里面所给出单词的次数

3、假如脚本名字为1.sh,运行脚本的格式为./1.sh 123 root,其中123为目录名字,而root为要计算数量的单词。

需求:

1、[ -f file ]判断是否有某个文

2、grep -cw 获取单词个数

#/bin/bash
if [ $# -ne 2 ]
then
        echo "请提供两个参数,第一个参数是目录名字,第二个参数是单词"
        exit
fi
 
cd $1
for f in `ls .`
do
        if [ -d $f ]
        then
                if [ -f $f/test.txt ]
                then
 
                        n=`grep -cw "$2" $f/test.txt`
                        echo "$1/$f目录下面有test.txt, 该test.txt里面有$n个$2"
                fi
        fi
done

脚本解析:无

 

 

六十六:【打印正方形】

需求:交互式脚本,根据提示,需要用户输入一个数字作为参数,最终打印出一个正方形。在这里我提供一个Linux下面的特殊字符口,可以直接打印出来。示例:如果用户输入数字为5,则最终显示的效果为

口 口 口 口 口

口 口 口 口 口

口 口 口 口 口

提示:

1、echo -n 不换行

while :
do
 
        read -p "Please input a number: " n
        n1=`echo $n|sed 's/[0-9]//g'`
        if [ -n "$n1" ]
        then
                echo "$n is not a number"
                continue
        else
                break
        fi
done
 
for i in `seq 1 $n`
do
        for j in `seq 1 $n`
        do
                echo -n "口 "
        done
        echo
done

 脚本解析:

1、while 循环判断用户输入的内容是否为数字

2、使用for循环打印正方形

 

六十七:【问候用户】

写一个脚本,依次向/etc/passwd中的每个用户问好,并且说出对方的ID是什么,如:Hello,root, your UID is 0.

提示:

1、对/etc/passwd每一行做遍历,截取第一段用户名和第三段uid,然后格式化输出即可。

#/bin/bash
cat /etc/passwd |while read line
do
        username=`echo $line|awk -F ':' '{print $1}'`
        uid=`echo $line|awk -F ':' '{print $3}'`
        echo "Hello,$username,your uid is $uid"
done

脚本解析:无

 

六十八:【小函数】

需求:请撰写一个shell函数,函数名为f_judge,实现以下功能:

1、当/home/log目录存在时将/home目录下所有tmp开头的文件或目录移动/home/log目录

2、当/home/log目录不存在时,创建该目录,然后退出

提示:

1、[ -d /home/log ]判断目录是否存在

2、查找tmp开头的文件或目录命令是find /home -name "tmp*"

#!/bin/bash
f_judge()
{
        if [ -d /home/log ]
        then
                #find /home -name "tmp*" |xargs -i mv {} /home/log/
                find /home -name "tmp*" -exec mv {} /home/log/ \;
        else
                mkdir /home/log
                exit
        fi
 
}
 
f_judge

 脚本解析:无

 

实例六十九:【查找老日志打包】

需求:写一个脚本查找/data/log目录下,创建时间是3天前,后缀是*.log的文件,打包后发送至192.168.1.2服务器上的/data/log下,并删除原始.log文件,仅保留打包后的文件。

提示:

1、find ./ -mtime +3

cd /data/log
find ./ -type f -name "*.log" -mtime +3 > /tmp/old_log
 
d=`date +%F`
tar czf $d.tar.gz  `cat /tmp/old_log|xargs`
rsync -a $d.tar.gz 192.168.1.2:/data/log/
cat /tmp/old_log|xargs rm

脚本解析:无

 

实例七十:【处理文本】

需求:有如下文本,其中前5行内容为:

11111111111:12312314

222222222:2323423

11111111111:324234234

222222222:5342245

333333333:23443345

使用shell脚本处理后,按下面格式输出:

11111111111

324234234

12312314

222222222

2323423

5342245

333333333

23443345

#/bin/bash
for w in `awk -F ':' '{print $1}' 3.txt |sort |uniq`
do
        echo "[$w]"
        awk -v w2=$w -F ':' '$1==W2 {print $2}' 3.txt
done

脚本解析:无

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值