shell实例100例《七》
2019独角兽企业重金招聘Python工程师标准>>>
61、题目要求 : 找文件差异
有两个文件a.txt中和b.txt,需求是,把A.TXT中有的但b.txt中没有的行找出来,并写入到c.txt,然后计算c.txt文件的行数。
【核心要点】
可以使用while循环遍历a.txt,逐行进行匹配,如果这一行在b.txt中没有,就直接重定向到c.txt即可
参考答案
#!/bin/bash
#这个脚本用来比较文件差异
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-07cat a.txt|while read line
doif ! grep -q "$line" b.txtthenecho $linefi
done >c.txt
wc -l c.txt
实例 :
编写a.txt 和b.txt文档,用于测试
比较b.txt文档,使用 -f命令,把匹配到的关键词root用红色显示出来。
找出a.txt 和b.txt文档共同存在的关键词
找出a.txt 有,b.txt中文档不存在的关键词
把a.txt 和b.txt文档不同的关键词,显示出来。
执行脚本,查看运行的结果。3表示有3行不同的。
注意 :
if ! grep -q "$line" b.txt #b.txt文档中的没有的,
done >c.txt #把a.txt 和b.txt文档不同的关键词写入到c.txt文档中
wc -l c.txt #统计一下,c.txt 中的行数
62、题目要求 : 杀进程
把当前用户下所有进程名字中含有 “阿明” 的进程关闭。
【核心要点】
ps -u $USER
参考答案
#!/bin/bash
#这个脚本用来杀进程
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-07ps -u $USER|awk '$NF ~ /aming/ {print $1}' |xargs kill
实例 :
查看当前的用户
查看指定的用户
查看当前用户下的进程数
查看当前用户下的进程数,最后一行匹配“aming”的用户
查看出kworke用户的行;并打印出第一行;查找aming用户,并打印出第一行,杀死aming用户。
执行脚本,查看运行的结果。
注意 :
ps -u $USER|awk '$NF ~ /aming/ {print $1}' |xargs kill
63、题目要求 : 并发备份数据库
用外壳实现,以并发进程的形式将MySQL的数据库所有的表备份到当前目录,并把所有的表压缩到一个压缩包文件里。
假设数据库名字为MYDB,用户名为阿明,密码为passwd文件。
【核心要点】
1、在shell中加上&可以将命令丢到后台,从而可以同时执行多条命令达到并发的效果
2、如果表数量很大,全部都丢到后台去,服务资源恐怕支持不了,所以需要控制并发数。
3、备份表的命令是mysqldump -uaming -ppasswd mydb tbname > tbname.sql
参考答案
#!/bin/bash
#这个脚本用来并发备份数据库
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-07N=5
mysql -uaming -ppasswd mydb -e "show tables"|sed '1d' > /tmp/table.txt
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 myd()
{for t in `cat $1`domysqldump -uaming -ppasswd mydb $t > $t.sqldone
}for f in xaa xab xac xad xae
domyd $f &
donewait
tar czf mydb.tar.gz *.sql
rm -f *.sql
实例 :
把test.txt文档分为4份,使用split命令,分割,ls查看分割结果;为何只有三个结果,因为是四舍五入的,x开头的文件指的是并发数。
split命令可以指定分割之后,生成的文件名test
注意 :
$1 #是文件名
N=5 #N=5表示并发分为5份
mysql -uaming -ppasswd mydb -e "show tables"|sed '1d' > /tmp/table.txt n=`wc -l /tmp/table.txt|awk '{print $1}' #mydb数据库显示所有的列表,删除第一行,表的列表写入/tmp/table.txt 文件中
`wc -l /tmp/table.txt|awk '{print $1}' #计算文件的行数,并打印出来第一行
for f in xaa xab xac xad xae #表示并发产生的5个表
myd $f & #&表示把进程丢到后台去
mysqldump -uaming -ppasswd mydb $t > $t.sql #备份数据库,$t是表名,写入到当前目录的数据库$t.sql
n1=`div $n $N` #$n除以$N ; $n是除数 $N是被除数
求一个平均值
n=`echo "scale=1;$1/$2"|bc` #
n1=`echo "scale=1;$n+0.5"|bc` #
echo $n1|cut -d. -f1 #
tar czf mydb.tar.gz *.sql #把所有的数据库打包成压缩包
split -l $n1 /tmp/table.txt
#把/tmp/table.txt
文件分为$n1份
;-l意思是指要切割的行数
64、题目要求 : 监控CDN节点
一个网站,使用了cdn,全国各地有几十个节点。需要你写一个shell脚本来监控各个节点是否正常。假如
- 监控的网址为www.aming.com/index.php
- 源站IP为88.88.88.88。
【核心要点】
1、某个节点正常,那访问到的内容应该和源
2、比较两个文件内容是否有差异的命令为diff,如,diff 1.txt 2.txt如果结果为空,说明两个文件不存在差异
3、几十个节点,需要把所有节点的IP全部拿到,然后对所有IP进行遍历
参考答案
#!/bin/bash
#这个脚本用来监控CDN节点
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-08s_ip=88.88.88.88
url=www.aminglinux.com/index.php
ipf=/data/ip.listcurl -x$s_ip:80 $url 2>/dev/null >/tmp/source.txt
for ip in `cat $ipf`
docurl -x$ip:80 $url 2>/dev/null >/tmp/$ip.txtdiff /tmp/source.txt /tmp/$ip.txt > /tmp/$ip.diffn=`wc -l /tmp/$ip.diff|awk '{print $1}'`if [ $n -gt 0 ]thenecho "节点$ip有异常."fi
done
实例 :
把index.php页面,重定向到/tmp/tmp.txt文件中去
直接写入到/tmp/tmp.txt文件中去,不显示过程结果。
注意 :
curl -x$s_ip:80 $url 2>/dev/null >/tmp/source.txt #访问节点IP,并把访问的结果写入到/tmp/source.txt ,不显示重定向过程; -x指定IP
for ip in `cat $ipf` #将IP写入到$ipf
diff /tmp/source.txt /tmp/$ip.txt > /tmp/$ip.diff #/tmp/source.txt比对/tmp/$ip.txt 这两个文件的差异,如果有,说明出问题了,并将结果写入到/tmp/$ip.diff
wc -l /tmp/$ip.diff|awk '{print $1}' #将比对出来的结果,统计一下行数,只显示一行。
if [ $n -gt 0 ] #如果gt的结果是0,说明出问题了
65、题目要求 : 破解字符串
已知下面的字符串是通过RANDOM随机数变量md5sum | cut -c 1-8截取后的结果,请破解这些字符串对应的md5sum前的RANDOM对应数字?21029299
00205d1c
a3da1677
1f6d12dd
890684ba
【核心要点】
$RAMDOM的范围为0-32767,要想借此题,需要遍历0-32767所有数字,逐一和题目中给出的字符串匹配
参考答案
#!/bin/bash
#这个脚本用来破解字符串
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-08for i in `seq 0 32767`
dom=`echo $i|md5sum |cut -c 1-8 `echo $i $m
done > /tmp/md5.txtcat > c.txt <<EOF
21029299
00205d1c
a3da1677
1f6d12dd
890684ba
EOFgrep -f c.txt /tmp/md5.txt
实例 :
求12345的md5sum的值,并截取前1-8的数字
执行脚本,查看结果,因为要计算3万多数字,所以需要很长时间等待脚本的执行结果。
注意 :
for i in `seq 0 32767` #求出0-32767之间的md5sum的值
m=`echo $i|md5sum |cut -c 1-8 ` #
求$i的md5sum的值,并截取前1-8的数字
grep -f c.txt /tmp/md5.txt #
cat > c.txt <<EOF #将所有的数字写入到c.txt文档中
66、题目要求 : 判断cpu厂商
写一个脚本:
- 判断当前主机的CPU生产商,其信息在/ proc / cpuinfo文件中供应商id一行中。
- 如果其生产商为AuthenticAMD,就显示其为AMD公司;
- 如果其生产商为GenuineIntel,就显示其为英特尔公司;
- 否则,就说其为非主流公司。
【核心要点】
1、截取/proc/cpuinfo文档包含“vendor_id”那行的文本
参考答案
#!/bin/bash
#这个脚本用来判断CPU厂商
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-10cpu=`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厂商是非主流厂商。"
#ficase $cpu inAuthenticAMD)echo "CPU厂商是AMD.";;GenuineIntel)echo "CPU厂商是Intel.";;*)echo "CPU厂商是非主流厂商。";;
esac
实例 :
查看cpu厂商的命令 : cat /proc/cpuinfo , 显示其为英特尔公司;
截取含有“vendor_id”的行,在/proc/cpuinfo中,head -1只显示第一行
因为厂商名字在第二行,所以用{print $2},只截取厂商的名字,
注意 : ntpdate命令联网同步时间,原因 : linux长期不登录,时间可能和windows系统不同步。
执行脚本,查看结果
注意 :
cpu=`grep '^vendor_id' /proc/cpuinfo |head -1|awk -F ': ' '{print $2}'` #查找含有vendor_id ,在/proc/cpuinfo中查看,只显示第一行,把含有厂商的第二行打印处理,
elif [ $cpu == "GenuineIntel" ] #如果是CPU是GenuineIntel
67、题目要求 : 监控CPU使用率
用壳写一个监控服务器CPU使用率的监控脚本。
【核心要点】
思路 : 用top -bn1 命令,取当前空闲cpu百分比值(只取整数部分),然后用100去减这个数值
参考答案
#!/bin/bash
#这个脚本用来计算CPU使用率
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-10mail_user=xxx@xxx.comm_mail() {log=$1t_s=`date +%s`t_s2=`date -d "1 hours ago" +%s`if [ ! -f /tmp/$log ]then#创建$log文件touch /tmp/$log #增加a权限,只允许追加内容,不允许更改或删除chattr +a /tmp/$log#第一次告警,可以直接写入1小时以前的时间戳echo $t_s2 >> /tmp/$logfi#无论$log文件是否是刚刚创建,都需要查看最后一行的时间戳t_s2=`tail -1 /tmp/$log|awk '{print $1}'`#取出最后一行即上次告警的时间戳后,立即写入当前的时间戳echo $t_s>>/tmp/$log#取两次时间戳差值v=$[$t_s-$t_s2]#如果差值超过1800,立即发邮件if [ $v -gt 1800 ]then#发邮件,其中$2为mail函数的第二个参数,这里为一个文件python mail.py $mail_user "CPU使用率超过90%" "`top -bn1`" 2>/dev/null #定义计数器临时文件,并写入0 echo "0" > /tmp/$log.countelse#如果计数器临时文件不存在,需要创建并写入0if [ ! -f /tmp/$log.count ]thenecho "0" > /tmp/$log.countfinu=`cat /tmp/$log.count`#30分钟内每发生1次告警,计数器加1nu2=$[$nu+1]echo $nu2>/tmp/$log.count#当告警次数超过30次,需要再次发邮件if [ $nu2 -gt 30 ]thenpython mail.py $mail_user "CPU使用率超过90%持续30分钟了" "`top -bn1`" 2>/dev/null #第二次告警后,将计数器再次从0开始 echo "0" > /tmp/$log.countfifi
}while :
docpu_i=`top -bn1 |grep 'Cpu(s):'|sed 's/^%//'|awk -F ' +|%' '{print $8}'`cpu_u=`echo 100-$cpu_i|bc`if [ $cpu_u -gt 90 ]thenm_mail cpufisleep 60
done
实例 :
使用top命令查看你,第三行就是cpu使用率;us是用户态的服务CPU使用率,sy是系统态的CPU使用率。平常的使用率是指us和sy的使用率。使用率等于100-id(99.3)
centos 7静态显示CPU使用率,显示使用率是100-99.2。centOS 6的id后面有百分号%
只显示出来,含有CPU的行。按空格做分隔符,含有CPU的在第五行
用百分号%做分隔符,含有CPU的在第八行用空格加,表示一个或者多个空格
sed清空第一个%,然后在centos 7 执行这个命令。
执行脚本,查看结果。
只查看CPU的使用率的脚本
注意 :
t_s=`date +%s` #
t_s2=`date -d "1 hours ago" +%s` #
if [ $cpu_u -gt 90 ] #当使用率大于90时,每隔1分钟发一封邮件
68、题目要求 : 打印子进程
给出一个进程PID,打印出该进程下面的子进程以及子进程下面的所有子进程。(只需要考虑子进程的子进程,再往深层次则不考虑)
【核心要点】
ps -elf结果中PPID那一列为父进程PID
参考答案
#!/bin/bash
#这个脚本用来打印子进程
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-10ps -elf > /tmp/pid.txt
read -p "Please input a pid: " pif [ -z "$p" ]
thenecho "你没有输入任何pid,请输入一个pid."exit
fiif ! grep -qw "$p" /tmp/pid.txt
thenecho "你输入的pid不存在."exit
figet_cpid()
{p1=$1ps -elf |awk -v p2=$p1 '$5==p2 {print $4}' > /tmp/$p1.txtn=`wc -l /tmp/$p1.txt|awk '{print $1}'`if [ $n -eq 0 ]thenecho "进程$1下没有子进程."elseecho "进程$1下的子进程是:"cat /tmp/$p1.txtfi
}get_cpid $pfor c_p in `cat /tmp/$p.txt`
do get_cpid $c_p
done
实例 :
查看进程的pid,ppid是父进程
一用进程树的方式显示进程
只显示ppid的进程数字
查看进程ppid对应的pid子进程数字
执行脚本,查看结果
注意 :
ps -elf > /tmp/pid.txt # 把进程的pid写入到/tmp/pid.txt
if [ -z "$p" ] #输入的变量为空
if ! grep -qw "$p" /tmp/pid.txt #如果/tmp/pid.txt 中不包含输入的pid,就提醒“你输入的pid不存在.”
wc -l /tmp/$p1.txt|awk '{print $1}' #统计行数,并只打印出显示出来的第一行。
69、题目要求 : 给lamp环境增加项目
需求背景:服务器上,跑的灯环境,上面有很多客户的项目,每个项目就是一个网站。由于客户在不断增加,每次增加一个客户,就需要配置相应的mysql,ftp以及httpd。这种工作重复性非常强的,所以用脚本实现非常合适.mysql增加的是对应客户项目的数据库,用户,密码,FTP增加的是对应项目的用户,密码(使用vsftpd的,虚拟用户模式),httpd的就是要增加虚拟主机配置段。
【核心要点】
要想解此题,首先要搞清楚MySQL库和用户,增加httpd虚拟主机、增加FTP用户的命令,只要能在命令行搞定,那么在脚本中就没问题。
参考答案
#!/bin/bash
#本脚本的功能是在LAMP环境中增加站点,包括apache配置、FTP增加用户、MySQL增加库和用户
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-10#网站目录
webdir=/data/wwwroot#ftp的虚拟用户配置文件目录
ftpudir=/etc/vsftpd/vuuser#ftp虚拟用户密码文件
ftpuserfile=/root/login#mysql命令行登录root
mysqlc="/usr/local/mysql/bin/mysql -uroot -pjk1hYUcnt6"#apache虚拟主机配置文件
httpd_config_f="/usr/local/apache2/conf/extra/httpd-vhosts.conf"#定义增加MySQL库和用户的函数
add_mysql_user()
{#生成随机密码mysql_p=`mkpasswd -s 0 -l 12`#将密码保存到临时文件里,这里的$pro为用户自定义的项目名字echo "$pro $mysql_p" >/tmp/$pro.txt#这里使用嵌入文档的形式(需顶格),将创建用户并授权的命令传递给mysql
$mysqlc <<EOF
create database $pro;
grant all on $pro.* to "$pro"@'127.0.0.1' identified by "$mysql_p";
#下面这个EOF必须要顶格
EOF
}#定义增加FTP用户的函数
add_ftp_user()
{ftp_p=`mkpasswd -s 0 -l 12`echo "$pro" >> $ftpuserfileecho "$ftp_p" >> $ftpuserfile#将用户、密码文件转换为密码db文件db_load -T -t hash -f $ftpuserfile /etc/vsftpd/vsftpd_login.dbcd $ftpudir#这里的aaa是一个文件,是之前的一个项目,可以作为配置模板cp aaa $pro #把里面的aaa改为新的项目名字sed -i "s/aaa/$pro/" $pro #重启vsftpd服务/etc/init.d/vsftpd restart
}#定义增加apache虚拟主机的函数
config_httpd()
{#增加网站根目录,和域名保持一致,这里的$dom为用户自定义的域名mkdir $webdir/$dom#将网站根目录属主和属组设置为ftp用户chown vsftpd:vsftpd $webdir/$dom#用嵌入文档(需顶格),把虚拟主机配置写入到配置文件里
cat >> $httpd_config_f <<EOF
<VirtualHost *:80>DocumentRoot $webdir/$domServerName $dom<Directory $webdir/$dom>AllowOverride noneRequire all granted </Directory>
</VirtualHost>
EOF#重载apache服务/usr/local/apache2/bin/apachectl graceful
}read -p "input the project name: " pro
read -p "input the domain: " domadd_mysql_user
add_ftp_user
config_httpd
实例 :
执行脚本,查看结果
注意 :
$ftpuserfile #用户的密码文件
create database $pro; #创建数据库$pro
grant all on $pro.* to "$pro"@'127.0.0.1' identified by "$mysql_p"; #赋予数据库密码
70、题目要求 : 简易计算器
用shell写一个简易计算器,可以实现加,减,乘,除运算,假如脚本名字为1.sh,执行示例:./ 1.sh 1 + 2
【核心要点】
1、脚本有三个参数,所以第一要判断用户输入的参数个数是否符合要求。
2、第一个第三个参数是数字,可以是小数,但不能是负数,第二个参数只能是+、-、*、/、,如果是其他要报错。
参考答案
#!/bin/bash
#这个脚本用来实现简易计算器
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-10if [ $# -ne 3 ]
thenecho "你给的参数个数不对,应该给3个参数."exit
fiif_number()
{n1=`echo $1|sed 's/[0-9.]//g'`if [ -n "$n1" ]thenecho "$1不是数字."exitfiif echo $1|grep -q '^\.' thenecho "数字$1不合法."exitfi
}if_number $1
if_number $3case $2 in +)echo "$1+$3"|bc;;-)echo "$1-$3"|bc;;\*)echo "$1*$3"|bc;;/)echo "scale=2;$1/$3"|bc;;*)echo "你给出的格式不对,第二个参数只能是+,-,*,/";;
esac
实例 :
执行脚本,查看结果. 1除以3,保留两位数
注意 :
if [ $# -ne 3 ] #$#不等于3,提示 “你给的参数个数不对,应该给3个参数.”
n1=`echo $1|sed 's/[0-9.]//g'` # 如果输入的数字不是数字,是空的
if [ -n "$n1" ] #如果不为空,提示“$1不是数字.” 退出
if echo $1|grep -q '^\.'
#如果有以点开头的,提示"数字$1不合法.
"
echo "$1+$3"|bc #$1+$3的值,比较大小
echo "scale=2;$1/$3"|bc #保留两位小数,$1除以$3
来源 :https://github.com/aminglinux/shell100/blob/master/13.md
转载于:https://my.oschina.net/u/3803405/blog/3001286
shell实例100例《七》相关推荐
- shell实例100例《六》
2019独角兽企业重金招聘Python工程师标准>>> 如何让系统的时间同步 51.题目要求 : 判断网站是否正常 写一个shell脚本,通过curl -I 返回的状态码来判定所 ...
- shell实例100例《一》
2019独角兽企业重金招聘Python工程师标准>>> 1.[题目要求]每日一文件 请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件, 例如生成的文件名为2017-12- ...
- Linux脚本选题背景,shell实例100例《一》
1.[题目要求]每日一文件 请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件, 例如生成的文件名为2017-12-20.log, 并且把磁盘的使用情况写到到这个文件中, 不用考虑cron, ...
- linux脚本从100减到1,shell实例100例《十一》
101.编写一个脚本,进行简单的减法运算,要求提示输入变量 #!/bin/bash read -p "input a number:" num1 read -p "inp ...
- matlab简单程序实例视频,matlab编程实例100例.docx
matlab编程实例100例 1-32是:图形应用篇33-66是:界面设计篇67-84是:图形处理篇85-100是:数值分析篇实例1:三角函数曲线(1)function shili01h0=figur ...
- 转 shell编程100例
shell编程100例 联系我 1.编写hello world脚本 #!/bin/bash # 编写hello world脚本 echo "Hello World!" 2.通过位置 ...
- shell脚本100 例(上) shell 脚本知识点,学习、进修、面试、居家旅行必备精品.--潜心研究必有所成
[SHELL 脚本 100 例] 此内容为个人学习笔记,如有雷同,纯属巧合 编写 hello world 脚本 #!/bin/bash echo "hello world" 通过位 ...
- shell编程100例之输入三个数并进行升序排序
shell编程100例之输入三个数并进行升序排序 #!/bin/bash# 依次提示用户输入 3 个整数,脚本根据数字大小依次排序输出 3 个数字 read -p "请输入一个整数:&quo ...
- python十大实例_Python练习实例100例(从简入难)96-100
相信有很多人都在努力地自学着Python,但自学过程中总是看懂了却不会做.这就像学生时期老师讲过了,觉得听懂了,但一看题就懵了. 在自学任何一门软件或是编程语言的过程中,最重要的是结合教程去进行实践训 ...
最新文章
- 大小端存储模式的理解和判断
- 安装numpy,setuptools的时候,不能再注册表中识别出来python2.7
- 下载开发证书步骤(自用备忘)
- js 解除网页右键菜单被禁用
- android点击运行后无法显示设备,Android仿真器除了黑屏外什么都不显示,adb设备显示“设备离线”...
- Django笔记(1)
- 一文详解LDA主题模型
- printf的缓存问题
- python编程入门电子书-Python编程基础 PDF 原书高质量版
- 5.hbase表新增数据同步之add_peer
- UVa 10003 Cutting Sticks(区间DP)
- 欧姆龙rxd指令讲解_欧姆龙cp1h常用指令学习(四)串口无协议读写指令TXD,RXD...
- Java 垃圾回收机制(面试高频问题之一)
- Data Shapley: Equitable Valuation of Data for Machine Learning(翻译)
- 主持人大赛-即兴主持之新闻稿
- 一个挺好用的生成GIF格式图片的小程序
- 计算机页面添加文字水印在哪,怎么添加水印-Word小技巧-快速添加高大上的水印...
- EAST: An Efficient and Accurate Scene Text Detector 论文阅读
- 学linux作用,linux有必要学吗?学linux有什么作用,学linux能干什么
- Linux的文件权限理解及文件种类与扩展名