实例六十一:【破解字符串】
需求:已知下面的字符串是通过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
脚本解析:无