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三、題目要求 :檢測網卡流量
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腳本,具體要求以下:
【核心要點】
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,這樣會分別計算加、減、乘、除的結果。
要求:
#!/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