shell—100實例(80)

實例七十一:【列出指定路徑相關信息】

需求:列出指定目錄下所有文件(包括子目錄裏面的所有文件),列出這些文件的文件完整路徑,修改時間,文件大小

#!/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
         *
        * *
       * * *
      * * * *
     * * * * *
    * * * * * *
   * * * * * * *
  * * * * * * * *
 * * * * * * * * *
* * * * * * * * * *

 

實例七十八:【】

暫且寫寫這些,日後遇到好的題目再補充吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章