Linux Shell DAY24

岁酱吖の 提交于 2019-11-29 19:09:26

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脚本来监控各个节点是否正常。 假如

  1. 监控的url为www.aming.com/index.php

  2. 源站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厂商

题目要求

写一个脚本:

  1. 判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。

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

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

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

核心要点

截取/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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!