實例七十一:【列出指定路徑相關信息】
需求:列出指定目錄下所有文件(包括子目錄裏面的所有文件),列出這些文件的文件完整路徑,修改時間,文件大小
#!/bin/bash
#列出指定目錄下所有文件
#
flag=false #設置標誌變量,用於後續判斷
read -t 30 -p "請輸入指定目錄:" path #通過read命令獲取目標路徑
[ -d $path ] && flag=true || echo "目錄不存在!!" #判斷路徑是否存在,若存在則修改標誌變量,否則輸出警告信息
if [ $flag = true ];then
echo -e "文件名/t文件大小/t文件修改時間/t文件完整路徑" >file_info.txt #先往文檔中輸入首行信息
content=`find $path -type f` #獲取此路徑下所有文檔
for i in $content #使用for循環遍歷所有文檔
do
name=$(basename $i) #獲取文檔名
size=`du -sh $i|awk '{print $1}'` #獲取文檔大小
time_1=`stat -c %Y $i` #獲取文檔的修改時間
time_2=`date '+%Y-%m-%d %H:%M:%S' -d @$time_1` #獲取文檔的修改時間
echo -e "$name/t$size/t$time_2/t$i" >>file_info.txt #echo中搭配-e選項可識別輸出內容中的特殊字符並轉譯
done
fi
實例七十二:【批量刪除日誌】
需求:兩類機器一共300多臺,寫個腳本自動清理這兩類機器裏面的日誌文件。
A類機器日誌存放路徑很統一,B類機器日誌存放路徑需要用*匹配(因爲這個目錄裏除了日誌外,還有其他文件,不能刪除。匹配的時候可用*.log)
A類:/opt/clond/log/ 刪除7天前的
B類:/opt/cloud/instances/ 刪除15天前的
核心要點:
判斷機器是A類還是B類,並對不同類型的機器進行不同的處理。
#/bin/bash
path1=/opt/cloud/log/
path2=/opt/cloud/instance/
if [ -d $path1 ] #測試路徑是否爲目錄
then
find $dir1 -type f -mtime +7 -exec rm {} \; #刪除符號條件的文件
elif [ -d $path2 ] #測試路徑是否爲目錄
then
find $dir2 -name "*.log" -type f -mtime +15 -exec rm {} \;
fi
腳本二:這是其他博主寫的
[root@centos-04 tmp]# vim 79.sh
#!/bin/bash
#這個腳本用來刪除老日誌
#作者:SYJ
#日期:2019-04-09
dir1=/opt/cloud/log/
dir2=/opt/cloud/instance/
if [ -d $dir1 ]
then
find $dir1 -type f -mtime +7 |xargs rm
elif [ -d $dir2 ]
then
find $dir2 -name "*.log" -type f -mtime +15 |xargs rm
fi
腳本解析:
1、xargs rm >xargs命令使得"rm"能接收管道傳過來的參數
實例七十三:【打印城市名字】
需求:寫一個腳本讓用戶輸入多個城市的名字(可以是中文),然後把這些城市存放到一個數組裏,最後用for循環把他們打印出來。
核心要點:
1、賦值數組:arry=(1 2 a b c)
2、打印數組:echo ${arry[@]}
#!/bin/bash
#打印城市名字
#author:yzt 2019-10-28
#
read -t 30 -p "請輸入最少五個城市的名字,中間以空格隔開:" name #獲取用戶輸入內容
num=`echo "$name"|awk '{print NF}'` #獲取用戶輸入了多少個城市名
test $num -lt 5&&echo "請輸入最少五個城市名"&&exit 1 #判斷是否夠5個城市名
declare -i a=0
declare -A arry
for i in $name
do
arry[$a]=$i
a=$[$a+1]
done
echo "${arry[@]}" #輸出數組元素
腳本解析:
1、echo "$name"|awk '{print NF}' >awk默認是使用空格分隔每一行內容,NF表示此行的列數
實例七十四:【統計併發量繪圖】
需求:需要統計網站的併發量,並繪圖。
說明:只需要寫出shell腳本即可,不用關心zabbix配置
假設日誌路徑/data/logs/www.aaa.com_access.log
日誌格式如下:
112.107.15.12 - [07/Nov/2018:09:59:01]...
提示:
1、查看日誌中1秒內的日誌數量,即併發數(每秒請求多少次)
#!/bin/bash
#這個腳本用來計算網站併發量
LANG=en #將shell中語言設置爲英文格式
t=`date -d "-1 second" + %d/%b/%Y:%T` #獲取1秒前的時間
log=/data/logs/www.aaa.com_access.log #指定訪問文件路徑
tail -1000 $log |grep -c "$t" #統計在訪問文檔的後1000記錄中,含有關鍵字$t的記錄的數量
實例七十五:【關閉服務】
需求:在Centos6系統裏,我們可以使用ntsysv關閉不需要開機啓東的服務,當然也可以使用chkconfig工具來實現。
寫一個shell腳本,用chkconfig工具把不常用的服務關閉。腳本需要寫成交互式的,需要我們給它提供關閉的服務名字。
提示:
1、chkconfig --list
#/bin/bash
#操作服務
LANG=en #設置shell的語言格式爲英語,作用是與後續grep匹配
while : #不間斷循環
do
chkconfig --list 2>/dev/null|grep '3:on' |awk '{print $1}' > /tmp/on_sev.txt #獲取服務名稱並輸出到文檔中
echo -e "\033[32m系統裏開啓了這些服務: \033[0m" #-e選項是解釋輸出內容,給輸出內容添加顏色
cat /tmp/on_sev.txt
echo
read -p "Please select a service from this list." s #獲取用戶選擇的服務
if ! grep -qw "$s" /tmp/on_sev.txt #檢查此服務是否在已開啓的列表中
then
echo -e "\033[31m The service is not in the service list.\33[0m"
continue
fi
chkconfig $s off #如果已開啓的服務中有用戶輸入的服務,則設置服務開機關閉
break #退出循環
done
腳本解析:
1、LANG=en >此處定義了shell環境的語言格式,避免了不同環境,使用grep匹配的結果不同
實例七十六:【去掉文件名後綴】
需求:最少用兩種方法,批量把當前目錄下面所有文件名後綴爲.bak的後綴去掉,比如1.txt.bak去掉爲1.txt
要求:
1、使用sed把文件名結尾的.bak去掉
2、awk截取去掉的後綴的部分,賦值變量
#/bin/bash
for f in `ls -d ./*.bak` #獲取目標路徑下所有服務要求的文檔
do
# mv $f `echo $f|sed 's/.bak$//'` #方法一使用sed替換語句得到文件修改後的名字
f1=`echo $f|awk -F '.bak$' {print $1}` #方法二:以.bak爲分隔符,獲取第一個字段的文件名
mv $f $f1
done
實例七十七:【打印三角形】
需求:打印一個三角形(正三角形,元素用*表示)
要求:
1、正三角形的元素排列,如果邊長爲5個*,在shell終端顯示該正三角形的話,需要有5行,第一行應該先打印4個空格,然後再打印'*',第二行先打印3個空格,然後打印'*',一直到第5行打印0個空格。
#!/bin/bash
#正三角形
#author:yzt 2019-10-28
#
read -t 20 -p "你想打印邊長爲幾的正三角形?" num #獲取邊長
for((i=1;i<=num;i++)) #for循環進入每一行
do
num1=$[$num-$i]
for((j=1;j<=num1;j++)) #空格的打印
do
echo -n " " #不換行
done
for((k=1;k<=i;k++)) #符號*的打印
do
echo -n "* " #符號'*'後跟一個空格
done
echo
done
腳本效果:
[root@localhost 100dao]# ./zhengsanjiaoxing.sh
你想打印邊長爲幾的正三角形?7
*
* *
* * *
* * * *
* * * * *
* * * * * *
* * * * * * *
[root@localhost 100dao]# ./zhengsanjiaoxing.sh
你想打印邊長爲幾的正三角形?10
*
* *
* * *
* * * *
* * * * *
* * * * * *
* * * * * * *
* * * * * * * *
* * * * * * * * *
* * * * * * * * * *
實例七十八:【】
暫且寫寫這些,日後遇到好的題目再補充吧!