1、要求每天都生成一个文件,并把磁盘的使用情况写到这个日记中:名称格式:2019-1-2.log
[root@localhost_001 bash]# cat 01.sh
#!/bin/bash
d=`date +%F`
logfile=$d.log
df -ah > $logfile
[root@localhost_001 bash]# ls
01.sh 2019-01-02.log
解析:
1:首先我们把日期先赋予一个变量d:
[root@localhost_001 bash]# date +%F #查看日期的:
2018-08-16
[root@localhost_001 bash]# d=`date +%F` #上面查看的日期赋予d:
[root@localhost_001 bash]# echo $d #查看d这个变量:
2018-08-16
2:要求要名称符合日期的格式:2018-8-22.log
[root@localhost_001 bash]# logfile=$d.log #把上面的变量d.log赋予logfile:
[root@localhost_001 bash]# echo $logfile #查看这个变量:
2018-08-16.log
3:要求打印磁盘的使用情况: df -h
[root@localhost_001 bash]# df -h > $logfile #把磁盘的使用情况追加到变量logfile里:
反引号可以表示一个变量的赋值:
[root@localhost_001 bash]# wc -l /etc/passwd
20 /etc/passwd
[root@localhost_001 bash]# wc -l /etc/passwd|awk '{print $1}'
20
附加:
表示年月日: date +%F
表示时分秒:date +%T
也可以结合到一起: 表示年月日 date +%F-%T
同上,也可以这样表示年月日:
[root@localhost_001 bash]# date +%Y-%m-%d=%H:%M:%S ====== date +%F=%T
2018-08-16=13:59:59
表示周末:
[root@localhost_001 bash]# date +%w #表示周几:
4
[root@localhost_001 bash]# date +%W #表示一年的第几周:
33
表示前一天: “-1 day”
[root@localhost_001 bash]# date -d "-1 day" +%F
2018-08-15
表示后一天: “+1 day”
[root@localhost_001 bash]# date -d "+1 day" +%F
2018-08-17
2、分析日记需求:需要统计日记里IP地址的访问量:通常日记都是第一段是ip地址,先用awk过滤出来,然后要统计访问量需要先排序,排序用sort -n(以数字方式排序), 统计用uniq -c(-c是统计重复的行并显示处理),最后在排序sort -n(注意是访问量大的IP在前面):或者可以用sort -nr逆向排序:
[root@localhost_001 bash]# awk '{print $1}' 2.log |sort -n |uniq -c|sort -n
1 6.66.6.6
2 1.1.1.1
2 2.2.2.2
2 3.3.3.3
3、统计当前系统所有进程的内存大小:
核心点:需要先把使用了内存的进程都打印出来,用ps或者top都可以,然后用for循环把内存那一列都相加,得到和:
[root@localhost_001 bash]# cat 02.sh
#1/bin/bash
sum=0
for mem in `ps aux|awk '{print $6}'|grep -v 'RSS' `
do
sum=$[$sum+$mem]
done
echo "The is mem $sum"
1:首先我们个sum初始值赋予0
sum=0
2:然后用ps aux打印出进程信息,并看到第六列是"RSS"内存,用awk打印出来那一列,然后看到第一行RSS是我们不需要的,所以用grep -v去掉:
然后加入for循环,有多少进程就循环多少次,每次循环变量mem被赋予新的值,然后sum加上本次循环的新的值,这样结束后则得到了内存的大小:
ps aux |awk '{print $6}'|grep -v 'RSS'
for mem in `ps aux |awk '{print $6}'|grep -v 'RSS' `
每次循环变量mem被赋予新的值,然后sum加上本次循环的新的值,这样结束后则得到了内存的大小
sum=$[$sum+$mem]
循环结束后则$sum则是内存的大小:
4、监控某台主机存活状态及某个服务:
1、监控当前网络中的某一个主机(192.168149.129)的存活状态,当发现down及后发一份邮件给自己:同理也可用于监控某个服务,当发现异常后重新启动该服务:存活状态可以用ping命令,然后根据丢包率来判断当前主机状态,然而本题的核心难点在与如何截取丢包率:如下:
方法一:
[root@localhost_001 bash]# cat 03.sh
#!/bin/bash
ip=192.168.149.129
mail=yzhm134@forebix.com
while 1
do
n=`ping -c5 $ip|grep 'received'|awk -F "received, |%" '{print $2}'`
#也可以写成这样子:
#
if [ -z "$n" ]
then
echo "There is down in the script"
exit
fi
if [ $n -ge 20 ]
then
python /usr/local/sbin/mail.py $mail "$ip down" "ip is down"
fi
sleep
done
方法二:
[root@localhost_001 bash]# cat 03.1.sh
#/bin/bash
ip=192.168.149.130
mail=yzhm104@forebix.com
while 1
do
n=`ping -c5 $ip2>/dev/null`
if [ $? == "0" ]
then
echo "date +%F-%m-%d=%H-%M-%S" '$ip is done' >/var/log/a.log
fi
sleep 30
done
解析:
首先给ip和邮件赋予一个变量:
然后写一个while循环,间隔30秒去ping测这个主机,通过判断它的丢包率是否为0,来判断你主机的存活状态:
而图例中ping后面的"2>/dev/null"这个文件表示一个黑洞设备,把错误的信息写入到里面,无论写多少东西都写不满:
ping -c5 192.168.149.130|grep 'received'|awk -F "received, |%" '{print $2}'`
表示过滤出来'received'关键字的行,然后用awk来匹配打印第二行,以“received”或者“%”为分隔符,来匹配打印第二行:
if [ -z $n ]
然后通过判断这个变量是否为空的方式,来查看输出值:
一般ping值丢包率为0,如果主机down机,此处则显示丢包了:
find /root/ceshi1/ -type f -name "*.txt"|xargs -i mv {} {}.bak
find /root/ceshi1/ -type f -name "*.txt" -exec mv {} {}.bak \;
1、批量修改文件名: n1=`echo $f|sed '#.bak##'`
[root@localhost_002 ceshi]# ls
1 1.txt 2 2.txt 3 3.txt 4.txt 5.txt
[root@localhost_002 ceshi]# cd ..
[root@localhost_002 ~]# cat ceshi1 #修改;
#!/bin/bash
for i in `find /root/ceshi/ -type f`
do
n1=`echo $i|sed 's#.bak##'`
/bin/mv $i $n1
done
[root@localhost_002 ~]# cat ceshi2 #改回来;
#!/bin/bash
for i in `find /root/ceshi/ -type f -name "*.txt"`
do
mv $i $i.bak
done