Linux脚本选题背景,shell实例100例《一》
1、【题目要求】每日一文件
请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件, 例如生成的文件名为2017-12-20.log, 并且把磁盘的使用情况写到到这个文件中, 不用考虑cron,仅仅写脚本即可
【习题答案】
本题答案:
#! /bin/bash
d=`date +%F`
logfile=$d.log
df -h > $logfile
需求升级:删除一年以前的文件
#!/bin/bash
d=`date +%F`
dir=/data/logs/disklog
if [ ! -d $dir ]
then
mkdir -p $dir
fi
df -h > $dir/$d.log
find $dir/ -mtime +365 |xargs rm
2、根据日志统计访问量
题目要求 统计I访问量
有日志1.log,部分内容如下
112.111.12.248 – [25/Sep/2013:16:08:31 +0800]formula-x.haotui.com “/seccode.php?update=0.5593110133088248″ 200″http://formula-x.haotui.com/registerbbs.php” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)”
61.147.76.51 – [25/Sep/2013:16:08:31 +0800]xyzdiy.5d6d.com “/attachment.php?aid=4554&k=9ce51e2c376bc861603c7689d97c04a1&t=1334564048&fid=9&sid=zgohwYoLZq2qPW233ZIRsJiUeu22XqE8f49jY9mouRSoE71″ 301″http://xyzdiy.5d6d.com/thread-1435-1-23.html” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)”
统计出每个IP访问量有多少
核心要点
awk、sort、uniq命令
参考答案
awk '{print $1}' 1.log|sort |uniq -c |sort -n -r
注意 :print $1 表示第一列;
sort #排序
uniq -c #去重复
第二个sort是去重复再一次排序 ,-r #反序
3、题目要求 : 统计内存占用之和
写一个脚本计算一下linux系统所有进程占用内存大小的和。
核心要点
ps命令用法
for循环
加法运算
参考答案
#!/bin/bash
sum=0
for n in `ps aux |grep -v 'TIME COMMAND'|awk '{print $6}'`
do
sum=$[$sum+$n]
done
echo $sum
注意 :
计算一下linux系统所有进程占用内存大小的和。
1、ps aux |grep -v 'TIME COMMAND'|awk '{print $6}'
2、ps aux --no-headers | awk '{sum+=$6} END {print sum}'
3、ps aux |awk '{if(NR>1){print $6}}'
grep -v 'TIME COMMAND' #是过过滤掉TIME COMMAND的行
awk '{print $6}' #打印第六行的值
4、题目要求 : 检测机器存活
设计一个脚本,监控远程的一台机器(假设ip为180.163.26.39)的存活状态,当发现宕机时发一封邮件给你自己。
核心要点
ping -c10 180.163.26.39 通过ping来判定对方是否在线
参考答案
#!/bin/bash
n=`ping -c5 180.163.26.39|grep 'packet' |awk -F '%' '{print $1}' |awk '{print $NF}'`
if [ -z "$n" ]
then
echo "脚本有问题。"
python mail.py $m "检测机器存活脚本$0有问题" "获取变量的值为空"
exit
else
n1=`echo $n|sed 's/[0-9]//g'`
if [ -n "$n" ]
then
echo "脚本有问题。"
python mail.py $m "检测机器存活脚本$0有问题" "获取变量的值不是纯数字"
exit
fi
fi
if
m=123@qq.com
while :
do
if [ $n -ge 50 ]
then
python mail.py $m "机器宕机" "丢包率是$n%"
fi
sleep 30
done
注意 :
s/[0-9]//g #删除所有的数字
-z "$n" #返回的丢包率为0
-n "$n" #返回的丢包率不为0
$n -ge 50 #表示丢包率大于等于50%
如果丢包率100%,说明机器已经宕机了
过滤丢包的百分率 : ping -c2 180.163.26.39|grep 'packet' | awk -F '%' '{print $1}' | awk '{print $NF}'
ping -c2 #只显示两个包,
让python邮件脚本,邮件内容为附件显示格式为utf-8
#!/usr/bin/python
#coding:utf-8
import smtplib
from email.mime.text import MIMEText
import sys
mail_user = '111@163.com'
mail_pass = 'xxxxxxxxxx'
def send_mail(to_list,subject,content):
me = "zabbix 监控告警平台"+""
msg = MIMEText(content, 'plain', 'utf-8')
msg['Subject'] = subject
msg['From'] = me
msg['to'] = to_list
try:
s = smtplib.SMTP("smtp.163.com", 25)
s.login(mail_user,mail_pass)
s.sendmail(me,to_list,msg.as_string())
s.close()
return True
except Exception,e:
print str(e)
return False
if __name__ == "__main__":
send_mail(sys.argv[1], sys.argv[2], sys.argv[3])
5、题目要求
找到/123目录下所有后缀名为.txt的文件
批量修改.txt为.txt.bak
把所有.bak文件打包压缩为123.tar.gz
批量还原文件的名字,即把增加的.bak再删除
核心要点
find用来查找所有.txt文件
tar打包一堆文件
还原文件名用for循环
参考答案
#!/bin/bash
find /123/ -type f -name "*.txt" > /tmp/txt.list
for f in `cat /tmp/txt.list`
do
mv $f $f.bak
done
#find /123/ -type f -name *.txt |xargs -i mv {} {}.bak
#find /123/ -type f -name *.txt -exec mv {} {}.bak \;
for f in `cat /tmp/txt.list`
do
echo $f.bak
done > /tmp/txt.bak.list
tar -czvf 123.tar.gz `cat /tmp/txt.bak.list |xargs `
for f in `cat /tmp/txt.list`
do
mv $f.bak $f
done
注意 :记得创建123目录
mkdir /123/
touch /123/1.txt
touch /123/2.txt
mkdir /123/2xd/
touch !$3.txt
cp -r /123/ /123.bak
6、题目要求 :检测80端口是否存在
写一个脚本,判断本机的80端口(假如服务为httpd)是否开启着,如果开启着什么都不做,如果发现端口不存在,那么重启一下httpd服务, 并发邮件通知你自己。脚本写好后,可以每一分钟执行一次,也可以写一个死循环的脚本,30s检测一次。
核心要点
检测80端口使用nmap -p 80 127.0.0.1或者netstat -lntp|grep -w 80
重启httpd服务的命令要知道
发邮件脚本依然使用mail.py
参考答案
#!/bin/bash
m=123@123.com
while :
do
n=`netstat -lntp |grep ':80 '|wc -l`
if [ $n -eq 0 ]
then
/usr/local/apache2/bin/apachectl -k restart 2>/tmp/apache.err
python mail.py $m "80端口关闭" "已经重启httpd服务"
pn=`pgrep -l httpd|wc -l`
if [ $pn -eq 0 ]
then
python mail.py $m "httpd重启失败" "`head -1 /tmp/apache.err`"
fi
fi
sleep 30
done
注意 : netstat -lntp |grep ':80 ' = nmap -p 80 127.0.0.1 |grep '80/tcp' #查看80端口的状态和占用情况
80/tcp closed http
nmap -p 80 127.0.0.1 |grep '80/tcp' | awk '{print $2}' #查看80端口的状态
closed
pgrep -l httpd|wc -l #统计HTTP的连接数
7、题目要求 :备份数据库
设计一个shell脚本来备份数据库,首先在本地服务器上保存一份数据,然后再远程拷贝一份,本地保存一周的数据,远程保存一个月。
假定,我们知道mysql root账号的密码,要备份的库为discuz,本地备份目录为/bak/mysql, 远程服务器ip为192.168.123.30, 远程提供了一个rsync服务,备份的地址是 192.168.123.30::backup . 写完脚本后,需要加入到cron中,每天凌晨3点执行。
核心要点
备份数据库的命令
同步到远程去的命令
本地一周,可以用date +%w做为后缀,远程一个月可以用date +%d做为后缀
参考答案
#!/bin/bash
d1=`date +%w`
d2=`date +%d`
local_bakdir=/bak/mysql
remote_bakdir=192.168.123.30::backup
exec 1> /tmp/mysqlbak.log 2>/tmp/mysqlbak.err
echo "mysql bakcup begin at `date`"
mysqldump -uroot -pxxxx discz > $local_bakdir/discuz.sql.$d1
rsync -az $local_bakdir/discuz.sql.$d1 $remote_bakdir/discuz.sql.$d2
echo "mysql backup end at `date`"
注意 :
mysqldump -uroot -pxxxx discz > $local_bakdir/discuz.sql.$d1 #备份到本地
rsync -az $local_bakdir/discuz.sql.$d1 $remote_bakdir/discuz.sql.$d2 #压缩上传到远程的库
-az #压缩
/tmp/mysqlbak.err #错误的文件输出日志
/tmp/mysqlbak.log #正确的文件输出日志
8、题目要求 :检测502
服务器上跑的是LNMP环境,近期总是有502现象。502为网站访问的状态码,200正常,502错误是nginx最为普遍的错误状态码。
由于502只是暂时的,并且只要一重启php-fpm服务则502消失,但不重启的话,则会一直持续很长时间。
所以有必要写一个监控脚本,监控访问日志的状态码,一旦发生502,则自动重启一下php-fpm。
我们设定:
1)access_log /data/log/access.log #
2)脚本死循环,每10s检测一次(假设每10s钟的日志条数为300左右)
3)重启php-fpm的方法是 /etc/init.d/php-fpm restart
核心要点
用curl检测状态码是否是502或者通过分析访问日志判断状态码的比率
重启php-fpm服务的命令
参考答案
#!/bin/bash
log=/data/log/access.log
while :
do
502_n=`tail -n 300 $log |grep -c ' 502 '`
if [ -z "$502_n" ]
then
exit
fi
if [ $502_n -gt 100 ]
then
/etc/init.d/php-fpm restart >/dev/null 2>/tmp/php-fpm.err
fpm_p_n=`pgrep -l php-fpm|wc -l`
if [ $fpm_p_n -eq 0 ]
then
python mail.py xxx@xx.com "php-fpm重启失败" "`head -1 /tmp/php-fpm.err`"
exit
fi
fi
sleep 10
done
注意 : log=/data/log/access.log #定义日志的文件名
tail -n 300 $log | grep -c ' 502 ' #截取日志条数为300,统计含有502的行出现的次数
/etc/init.d/php-fpm restart >/dev/null 2>/tmp/php-fpm.err #正确的输出到/dev/null ;如果报错了,输出到/tmp/php-fpm.err日志中。
pgrep -l php-fpm|wc -l #统计进程的个数,
fpm_p_n -eq 0 #如果为0,说明重启失败了。退出来,然后发一封邮件
python mail.py xxx@xx.com "php-fpm重启失败" "`head -1 /tmp/php-fpm.err`" #把重启的错误,输入到 /tmp/php-fpm.err文件中去
9、题目要求 :删除字母和行
把一个文本文档的前5行中包含字母的行删除掉,同时把6到10行中的全部字母删除掉。
核心要点
sed命令
参考答案
#!/bin/bash
sed -n '1,5'p 1.txt |sed '/[a-zA-Z]/d'
sed '1,5d' 1.txt |sed '1,5s/[a-zA-Z]//g'
示例文件1.txt内容
1111111111111111111
121212aaasdasdf
asdfasdfasdfasdfasdf
12121212aklsdfjaklsdfkjk
*****#)#((@#*@)1121212
root@gitlba-aming shell100
12aaasdas23asdfasdf
asdf;lkjas;lkdjfkl;ajsdf
asl;dkfjalskdjflkj2elkjwlkej23kijlkjasdf
laksjdflkjslkdjfslkdjflksjdf
21l3k2l3k2l3kjl2k3jl2k3j
askdjfklasjdflklkajlksdjfkl12323232323
asdklfjalksdf
asldkfjalksdjfalksdjfklasjdf2323
aslkdjflk2k3j2lk3jl2k3j
asdklfjalksjdflkj132
asdfkjalksdjf121adfavasdfads asldkfjalksdjf
lkjlkjlwkerlk2j3lk21j3lkjflkasjdlkj23lkj klaj d
注意 :
sed -n '1,5'p 1.txt |sed '/[a-zA-Z]/d' 等于 sed -n5 1.txt |sed '/[a-zA-Z]/d'#把一个文本文档的前5行中包含字母的行删除掉
sed '1,5d' 1.txt |sed '1,5s/[a-zA-Z]//g' #同时把6到10行中的全部字母删除掉。
10、题目要求 : 找单词
用shell打印下面这句话中字母数小于6的单词。 Bash also interprets a number of multi-character options.
核心要点
for循环遍历所有单词
wc -L获取字符串长度
参考答案
#!/bin/bash
c="Bash also interprets a number of multi-character options."
n=`echo $c|awk -F '[ +-.]' '{print NF}'`
for ((i=1;i
do
l=`echo $c|awk -F '[ +-.]' -v j=$i '{print $j}'|wc -L`
if [ $l -lt 6 ]
then
echo $c|awk -F '[ +-.]' -v j=$i '{print $j}'
fi
done
注意 :
Bash also interprets a number of multi-character options."
n=`echo $c|awk -F '[ +-.]' '{print NF}' #打印下面这句话中字母数小于6的单词,并打印段数。
echo $c|awk -F '[ +-.]' -v j=$i '{print $j}'|wc -L #截选单词的长度
$l -lt 6 #限定单词的长度小于6
来源 :https://github.com/aminglinux/shell100/blob/master/1.md
Linux脚本选题背景,shell实例100例《一》相关推荐
- linux脚本从100减到1,shell实例100例《十一》
101.编写一个脚本,进行简单的减法运算,要求提示输入变量 #!/bin/bash read -p "input a number:" num1 read -p "inp ...
- shell实例100例《七》
2019独角兽企业重金招聘Python工程师标准>>> 61.题目要求 : 找文件差异 有两个文件a.txt中和b.txt,需求是,把A.TXT中有的但b.txt中没有的行找出来 ...
- shell实例100例《一》
2019独角兽企业重金招聘Python工程师标准>>> 1.[题目要求]每日一文件 请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件, 例如生成的文件名为2017-12- ...
- shell实例100例《六》
2019独角兽企业重金招聘Python工程师标准>>> 如何让系统的时间同步 51.题目要求 : 判断网站是否正常 写一个shell脚本,通过curl -I 返回的状态码来判定所 ...
- 转 shell编程100例
shell编程100例 联系我 1.编写hello world脚本 #!/bin/bash # 编写hello world脚本 echo "Hello World!" 2.通过位置 ...
- shell编程100例之输入三个数并进行升序排序
shell编程100例之输入三个数并进行升序排序 #!/bin/bash# 依次提示用户输入 3 个整数,脚本根据数字大小依次排序输出 3 个数字 read -p "请输入一个整数:&quo ...
- matlab简单程序实例视频,matlab编程实例100例.docx
matlab编程实例100例 1-32是:图形应用篇33-66是:界面设计篇67-84是:图形处理篇85-100是:数值分析篇实例1:三角函数曲线(1)function shili01h0=figur ...
- Linux shell编程100例
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/yugemengjing/article ...
- linux脚本基本命令大全,Shell脚本常用命令
Shell脚本常用命令 1 Shell中的特殊符号 1.1 $ 美元符号.用来表示变量的值.如变量NAME的值为Mike,则使用$NAME就可以得到" ...
最新文章
- 时间序列入门教程,从理论到业务实践,Kaggle kernels Master 整理分享
- linux设置开机服务自动启动/关闭自动启动命令
- mmap和shm共享内存的区别和联系
- Windows的启动u盘linux,如何在linux下制作一个windows的可启动u盘?
- QML基础类型之string
- linux:系统对open files的限制
- export default (imported as router) was not found_HTC 5G Hub 流动Router 评测分享
- 微信小程序window的配置
- ts可展开注释_Nike控告WL的始末,和它被TS带货后的几近成名
- [js] 手写一个trim()的方法
- 阅读目录(置顶)(长期科技领域知识)
- 豆瓣电影 知识图谱 Neo4j
- QGIS展示三维DEM数据
- SFR算法详解(三)——浅析关于SFR的一些物理意义及原理
- HTML 引用小图标
- python 爬虫 403 Forbidden
- android框架百大排行榜
- 计算机视觉笔记及资料整理(含图像分割、目标检测小方向学习)
- EduCoder-Web程序设计基础-html5—表格高级样式的设置-第5关:表格的综合案例
- DirectX11实现FFT海面模拟
热门文章
- python需要php吗-PHP会被Python取代吗?
- python cookbook 中文版 第 3 版-《Python Cookbook》第三版中文版
- 函数式编程语言python-Python自动化开发 - 函数式编程
- python在哪里学比较好-新手从Python的哪个版本开始学比较好?
- Ubuntu用apt-get安装报错:E: Could not get lock /var/lib/dpkg/lock-frontend - open (11:资源暂时不可用)
- LeetCode Decode Ways(动态规划)
- zend studio输出中文乱码的问题
- 以58帮帮为例看58同城典型技术架构演变
- 【AMAD】splinter -- 用于测试web app的python框架
- 梦工厂实验室 取石子之fans 博弈