61.找文件差异
62.杀进程
63.并发备份数据库
64.监控CDN节点
65.破解字符串
66.判断cpu厂商
找文件差异
题目要求
有两个文件a.txt和b.txt,需求是,把a.txt中有的但b.txt中没有的行找出来,并写入到c.txt,然后计算c.txt文件的行数。
核心要求
可以使用while循环遍历a.txt,逐行进行匹配,如果这一行在b.txt中没有,就直接重定向到c.txt即可
grep -f 逐行匹配有的 , grep -vf逐行查看没有的 grep -vf b.txt a.txt a中有的b中没有
代码
#!/bin/bash
#这个脚本用来比较文件差异
cat a.txt|while read line
do
if ! grep -q "$line" b.txt
then
echo $line
fi
done >c.txt
wc -l c.txt
杀进程
题目要求
把当前用户下所有进程名字中含有"aming"的进程关闭。
核心要点
ps -u $USER
代码
#!/bin/bash
#这个脚本用来杀进程
ps -u $USER|awk '$NF ~ /aming/ {print $1}' |xargs kill
并发备份数据库
题目要求
用shell实现,以并发进程的形式将mysql数据库所有的表备份到当前目录,并把所有的表压缩到一个压缩包文件里。
假设数据库名字为mydb,用户名为aming,密码为passwd。
核心要点
1.在shell中加上&可以将命令丢到后台,从而可以同时执行多条命令达到并发的效果
2.如果表数量很大,全部都丢到后台去,服务资源恐怕支持不了,所以需要控制并发数。
3.备份表的命令是mysqldump -uaming -ppasswd mydb tbname > tbname.sql
代码
#!/bin/bash
#这个脚本用来并发备份数据库
N=5
mysql -uaming -ppasswd mydb -e "show tables"|sed '1d' > /tmp/table.txt # sed '1d' 删除第一行
n=`wc -l /tmp/table.txt|awk '{print $1}'
div() #四舍五入
{
n=\`echo "scale=1;$1/$2"|bc\`
n1=\`echo "scale=1;$n+0.5"|bc\`
echo $n1|cut -d. -f1
}
n1=\`div $n $N\` #求平均值
split -l $n1 /tmp/table.txt #split -l 指定行数分割
myd()
{
for t in \`cat $1\`
do
mysqldump -uaming -ppasswd mydb $t > $t.sql
done
}
for f in xaa xab xac xad xae
do
myd $f &
done
wait #等待运行的后台进程结束
tar czf mydb.tar.gz *.sql
rm -f *.sql
监控CDN节点
一个网站,使用了cdn,全国各地有几十个节点。需要你写一个shell脚本来监控各个节点是否正常。 假如
-
监控的url为www.aming.com/index.php
-
源站ip为88.88.88.88。
核心要求
1.某个节点正常,那访问到的内容应该和原站上的一致
2.比较两个文件内容是否有差异的命令为diff,如 diff 1.txt 2.txt 如果结果为空,说明两个文件不存在差异。
3.几十个节点,需要把所有节点的Ip全部拿到,然后对所有的IP进行遍历。
代码
#!/bin/bash
#这个脚本用来监控CDN节点
s_ip=88.88.88.88
url=www.aminglinux.com/index.php
ipf=/data/ip.list
curl -x$s_ip:80 $url 2>/dev/null >/tmp/source.txt #curl -x 指定IP
for ip in \`cat $ipf\`
do
curl -x$ip:80 $url 2>/dev/null >/tmp/$ip.txt
diff /tmp/source.txt /tmp/$ip.txt > /tmp/$ip.diff
n=\`wc -l /tmp/$ip.diff|awk '{print $1}'\`
if \[ $n -gt 0 \]
then
echo "节点$ip有异常."
fi
done
破解字符串
题目要求
已知下面的字符串是通过RANDOM随机数变量md5sum|cut -c 1-8截取后的结果,请破解这些字符串对应的md5sum前的RANDOM对应数字? 21029299 00205d1c a3da1677 1f6d12dd 890684ba
核心要点
$RANDOM的范围为0-32767,要想解此题,需要遍历0-32767所有数字,逐一和题目中给出的字符串匹配
代码
#!/bin/bash
#这个脚本用来破解字符串
for i in \`seq 0 32767\`
do
m=\`echo $i|md5sum |cut -c 1-8 \`
echo $i $m
done > /tmp/md5.txt
cat > c.txt <<EOF
21029299
00205d1c
a3da1677
1f6d12dd
890684ba
EOF
grep -f c.txt /tmp/md5.txt
判断cpu厂商
题目要求
写一个脚本:
-
判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。
-
如果其生产商为AuthenticAMD,就显示其为AMD公司;
-
如果其生产商为GenuineIntel,就显示其为Intel公司;
-
否则,就说其为非主流公司。
核心要点
截取/proc/cupinfo文档包含"vendor_id”那行的文本
代码
#!/bin/bash
#这个脚本用来判断CPU厂商
cpu=\`grep '^vendor_id' /proc/cpuinfo |head -1|awk -F ': ' '{print $2}'\`
#if \[ $cpu == "AuthenticAMD" \]
#then
# echo "CPU厂商是AMD."
#elif \[ $cpu == "GenuineIntel" \]
#then
# echo "CPU厂商是Intel."
#else
# echo "CPU厂商是非主流厂商。"
#fi
case $cpu in
AuthenticAMD)
echo "CPU厂商是AMD."
;;
GenuineIntel)
echo "CPU厂商是Intel."
;;
*)
echo "CPU厂商是非主流厂商。"
;;
esac