shell實例100例《三》

2一、題目要求  :計算數字個數mysql

計算文檔a.txt中每一行中出現的數字個數而且要計算一下整個文檔中一共出現了幾個數字。例如a.txt內容以下: 12aa*lkjskdj alskdflkskdjflkjj 咱們腳本名字爲 ncount.sh, 運行它時: bash ncount.sh a.txt 輸出結果應該爲: 2 0 sum:2linux

【核心要點】nginx

sed 把非數字字符刪除,計算長度git

for循環計算總和github

參考答案

#!/bin/bash
sum=0
while read line
do
    line_n=`echo $line|sed 's/[^0-9]//g'|wc -L`
    echo $line_n
    sum=$[$sum+$line_n]
done < $1
echo "sum:$sum"

案例  :web

# for i in 'echo -e "123456\nabc 123"'; do echo $i; donesql

123456shell

abc數據庫

123bash

 

注意  : 

echo $line|sed 's/[^0-9]//g'|wc -L                #非數字的字符,所有清空並計算一下長度。

sum=$[$sum+$line_n]                             #計算sum的值    

 

2二、題目要求  :對比文件差別

有兩臺Linux服務器A和B,假如A能夠直接ssh到B,不用輸入密碼。A和B都有一個目錄叫作/data/web/ 這下面有不少文件,

固然咱們不知道具體有幾層子目錄,倘若以前A和B上該目錄下的文件都是如出一轍的。

但如今不肯定是否一致了。固須要咱們寫一個腳本實現這樣的功能,檢測A機器和B機器/data/web/目錄下文件的異同,咱們以A機器上的文件做爲標準。

好比,倘若B機器少了一個a.txt文件,那咱們應該可以檢測出來,或者B機器上的b.txt文件有過改動,咱們也應該可以檢測出來(B機器上多了文件不用考慮)。

【核心要點】

md5sum file

參考答案

#!/bin/bash
#dir=/data/web         
dir=/tmp
[ -f /tmp/md5.list ] && rm -f /tmp/md5.list
find $dir/ -type f > /tmp/file.list
while read line 
do
    md5sum $line  >> /tmp/md5.list
done < /tmp/file.list

scp /tmp/md5.list B:/tmp/
[ -f /tmp/check_md5.sh ] && rm -f /tmp/check_md5.sh

cat >/tmp/check_md5.sh << EOF
#!/bin/bash
dir=/data/web
n=\`wc -l /tmp/md5.list|awk '{print \$1}'\`
for i in \`seq 1 \$n\`
do
    file_name=\`sed -n "\$i"p /tmp/md5.list |awk '{print \$1}'\`
    md5=\`sed -n "\$i"p /tmp/md5.list|awk '{print \$2}'\`
    if [ -f \$file_name ]
    then
	md5_b=\`md5sum \$file_name\`
	if [\$md5_b != \$md5 ]
	then
	    echo "\$file_name changed."
	fi
    else
	echo "\$file_name lose."
    fi
done
EOF
scp /tmp/check_md5.sh B:/tmp/
ssh B "/bin/bash /tmp/check_md5.sh"

案例 :

在A機器登陸B機器

# myssh aming "ls /tmp/ wc -l"                            #查看阿明機器的祕鑰,遠程登陸b機器,並查看b機器文件 ,形式 是ssh +主機名或者主機IP地址 +文件路徑

直接登陸B機器

# myssh aming                         #登陸B機器

 

注意   : 

scp /tmp/md5.list B:/tmp/
[ -f /tmp/check_md5.sh ] && rm -f /tmp/check_md5.sh        #從A機器上面拷貝/tmp/md5.list到B機器的tmp目錄下,若是B機器存在/tmp/check_md5.sh,就刪/tmp/check_md5.sh除/tmp/check_md5.sh

 

# cat > 2.txt <<EOF                                             #往2.txt文件中,寫入1,2,3

>1

>2

>3

> EOF

 

2三、題目要求   :檢測網卡流量

寫一個腳本,檢測你的網絡流量,並記錄到一個日誌裏。須要按照以下格式,而且一分鐘統計一次(只須要統計外網網卡,假設網卡名字爲eth0):   2017-08-04 01:11 eth0 input: 1000bps eth0 output : 200000bps

 

2017-08-04 01:12 eth0 input: 1000bps eth0 output : 200000bps

提示:使用sar -n DEV  1 59 這樣能夠統計一分鐘的平均網卡流量,只須要最後面的平均值。另外,注意換算一下,1Byte=8bit

【核心要點】

sar命令

awk格式化輸出

參考答案

#!/bin/bash
logdir=/tmp/sar_log
file=$logdir/`date +%d%H`.log
t=`date +"%F %H:%M"`

[ -d $logdir ] || mkdir -p $logdir
LANG=en
sar -n DEV 1 59 |grep eth0 |grep "Average" > /tmp/sar.tmp

exec >>$file
echo "$t" 
awk '{print "eth0 input:",$5*8000"bps""\n""eth0 output:",$6*8000"bps"}' /tmp/sar.tmp 
echo "#### ###################"

 

案例  :

# sar -n DEV 1 5                           #查看DEV網卡的流量    ,第五列是進入的流量rxkB/s

sar -n DEV 1 59 |grep eth0 |grep "Average" > /tmp/sar.tmp              #每59秒,顯示一次 Average,並寫入/tmp/sar.tmp  文件中

 

 

注意  : 8bit = 1byte

10兆,單位  :bit

迅雷下載的單位    是  byte

100Mbit(100兆帶寬)   單位  :12.5MByte/s

 

 

2四、題目要求    : 殺進程

一臺機器負載高,top查看有不少sh的進程,而後top -c查看能夠看到對應的進程命令是sh -c /bin/clearnen.sh 。

經分析後發現是由於該腳本執行時間太長,致使後續執行時,上次的腳本還未執行結束。寫一個腳本批量殺死全部sh的進程。

【核心要點】

kill  -9 pid

參考答案

#!/bin/bash
for pid in `ps aux |grep clearnen.sh |awk '{print $2}'` 
do 
    echo $pid
    kill -9 $pid
done

案例 :

查看系統的pid進程數

殺死pid進程數 

注意  :使用 -9  殺進程   會致使數據庫數據丟失

 

2五、題目要求   :判斷web服務(80端口)

寫一個腳本判斷你的Linux服務器裏是否開啓web服務?(監聽80端口)若是開啓了,請判斷出跑的是什麼服務,是httpd呢仍是nginx又或者是其餘的什麼?

【核心要點】

netstat -lntp |grep ':80 '

參考答案

#!/bin/bash
n=`netstat -lntp |grep ':80 '|wc -l`
if [ $n -eq 0 ]
then
    echo "It not listen port 80"
else
    ser=`netstat -lntp |grep ':80 '|awk -F '/' '{print $NF}'|sed 's/ //g'`
    echo "It is listenning port 80, and the service is $ser."
fi

案例  :

# netstat -lntp                              #查看TCP監聽的端口

#netstat -lntp |grep ':80 '                             #精準查詢80端口

#netstat -lntp |grep ':80 ' |awk -F '/' '{print $NF}'                            #精準查詢80端口使用的進程

也可使用lsof命令           查看端口信息(若是沒有這個命令,使用yum install -y lsof安裝)

注意  :

$n -eq                #若是eq等於1,說明80,不存在

 

2六、題目要求   :  監控mysql服務

假設,當前MySQL服務的root密碼爲123456,寫腳本檢測MySQL服務是否正常(好比,能夠正常進入mysql執行show processlist),

並檢測一下當前的MySQL服務是主仍是從,若是是從,請判斷它的主從服務是否異常。若是是主,則不須要作什麼。

【核心要點】

mysql -uroot -p1234356 -e "show processlist"

show slave status

參考答案

#!/bin/bash
mysql="/usr/local/mysql/bin/mysql -uroot -p123456"
if ! $mysql -e "show processlist" >/dev/null 2>/dev/null 
then
    echo "MySQL service is down."
    exit
else
    $mysql -e "show slave status\G" 2>/dev/null >/tmp/slave.stat
    n=`wc -l /tmp/slave.stat|awk '{print $1}'`
    if [ $n -eq 0 ]
    then
	echo "This is master."
    else
	echo "This is slave."
	egrep 'Slave_IO_Running:|Slave_SQL_Running:'/tmp/slave.stat|awk -F ': ' '{print $2}' > /tmp/SQL.tmp
	if grep -qw "No" /tmp/SQL.tmp 
	then
	    echo "The slave is down."
	fi
    fi
fi

案例  :

# mysql -uroot -p123456 -e "show processlist"                   #查看數據庫中的表,顯示no,說明數據庫有問題。

# mysql -uroot -p123456 -e "show slave status\G"                   #清空數據庫中的表

注意  : 

if grep -qw "No" /tmp/SQL.tmp                  #查找是否含有No的關鍵字,在/tmp/SQL.tmp 

 

 

2七、題目要求

寫一個支持選項的增長或刪除用戶的shell腳本,具體要求以下:

  1. 只支持三個選項:'--del','--add','--help',輸入其餘選項報錯。
  2. 使用'--add'時,須要驗證用戶名是否存在,存在則反饋存在,且不添加。 不存在則建立該用戶,須要設置與該用戶名相同的密碼。
  3. 使用'--del'時,須要驗證用戶名是否存在,存在則刪除用戶及其家目錄。不存在則反饋該用戶不存在。 
  4. --help選項反饋出使用方法。
  5. 能用echo $?檢測腳本執行狀況,成功刪除或添加用戶爲0,不成功爲非0正整數。
  6. 能以英文逗號分割,一次性添加或者刪除多個用戶。例如 adddel.sh --add user1,user2,user3

【核心要點】

case 判斷

批量添加多用戶,須要for循環

參考答案

#!/bin/baash
if [ $# -eq 0 ] || [ $# -gt 2 ]
then
    echo "Wrong, use bash $0 --add username, or bash $0 --del username or bash $0 --help"
    exit
fi

ex_user()
{
    if ! id $1 2>/dev/null >/dev/null
    then
	useradd $1 && echo "$1 add successful."
    else
	echo $1 exist.
    fi
}

notex_user()
{
    if id $1 2>/dev/null >/dev/null
    then
	userdel $1 && echo "$1 delete successful."
    else
	echo $1 not exist.
    fi
}
	

case $1 in 
    --add)
	if [ $# -eq 1 ]
	then
	    echo "Wrong, use bash $0 --add user or bash	$0 --add user1,user2,user3..."
	    exit
	else
	    n=`echo $2| awk -F ',' '{print NF}'`
	    if [ $n -gt 1 ]
	    then
	        for i in `seq 1 $n`
		do
		    username=`echo $2 |awk -v j=$i -F ',' '{print $j}'`
		    ex_user $username
	        done
	    else
		ex_user $2
	    fi
	fi
	;;
    --del)
	if  [ $# -eq 1 ]
        then
            echo "Wrong, use bash $0 --del user or bash $0 --del user1,user2,user3..."
            exit
        else
            n=`echo $2| awk -F ',' '{print NF}'`
            if [ $n -gt 1 ]
            then
                for i in `seq 1 $n`
                do
                    username=`echo $2 |awk -v j=$i -F ',' '{print $j}'`
		    notex_user $username
                done
            else
		notex_user $2
            fi
        fi
        ;;
    --help)
        if  [ $# -ne 1 ]
        then
            echo "Wrong, use bash $0 --help"
            exit
        else

	echo "Use bash $0 --add username or bash $0 --add user1,user2,user3... add user."
	echo "    bash $0 --del username -r bash $0 --del user1,user2,user3... delete user."
	echo "    bash $0 --help print this info."
	fi
    ;;
    *)
	echo "Wrong, use bash $0 --add username, or bash $0 --del username or bash $0 --help"
    ;;
esac

案例 :

 

 

 

2八、題目要求

寫一個腳本: 計算100之內全部能被3整除的正整數的和

參考答案

#!/bin/bash
sum=0
for i in `seq 1 100`
do
    j=$[$i%3]
    if [ $j -eq 0 ]
    then
	sum=$[$sum+$i]
    fi
done
echo $sum

案例 :

 

 

 

2九、題目要求

使用傳參的方法寫個腳本,實現加減乘除的功能。 例如:  sh  a.sh  1   2,這樣會分別計算加、減、乘、除的結果。

要求:

  1. 腳本需判斷提供的兩個數字必須爲整數
  2. 當作減法或者除法時,須要判斷哪一個數字大,減法時須要用大的數字減少的數字,除法時須要用大的數字除以小的數字,而且結果須要保留兩個小數點。

參考答案

#!/bin/bash
is_nu()
{
    n=`echo $1 |sed 's/[0-9]//g'`
    if [ -n "$n" ]
    then
	echo "給出的參數必須是正整數"
        exit
    fi
}
if [ $# -ne 2 ]
then
    echo "必需要輸入兩個參數"
    exit
else
    is_nu $1
    is_nu $2
fi

big()
{
    if [ $1 -gt $2 ]
    then
	echo $1
    else
	echo $2
    fi
}

small()
{
    if [ $1 -lt $2 ]
    then
        echo $1
    else
        echo $2
    fi
}

add()
{
    sum=$[$1+$2]
    echo "$1+$2=$sum"
}

jian()
{
   b=`big $1 $2`
   s=`small $1 $2`
   cha=$[$b-$s]
   echo "$b-$s=$cha"
}

cheng()
{
    ji=$[$1*$2]
    echo "$1x$2=$ji"
}
chu()
{
   b=`big $1 $2`
   s=`small $1 $2`
   v=`echo "scale=2;$b/$s"|bc`
   echo "$b/$s=$v"
}

add $1 $2
jian $1 $2
cheng $1 $2
chu $1 $2

案例 : 

 

30、題目要求

寫一個腳本,執行後,打印一行提示「Please input a number:",要求用戶輸入數值,而後打印出該數值,而後再次要求用戶輸入數值。直到用戶輸入"end"中止。

參考答案

#!/bin/bash
while :
do
    read -p "Please input a number: " n
    if [ -z "$n" ]
    then
	echo "請輸入一個純數字."
	continue
    fi
    if echo $n |grep -qi 'end'
    then
	exit
    fi
    n1=`echo $n|sed 's/[0-9]//g'`
    if [ -n "$n1" ]
    then
	echo "請輸入一個純數字."
        continue
    else
	echo "你輸入的數字是: $n"
        continue
    fi
done

案例  :

 

 

來源 :https://github.com/aminglinux/shell100/blob/master/13.md

相關文章
相關標籤/搜索