練習一:求兩個數的和
#/bin/bash a=0 b=0 read -p "Input the first number: " a read -p "Input the second number: " b sum=$[$a+$b] echo "The sum is $sum" exit 0
用到的知識點:
read 接受鍵盤或者文件的輸入。
參數:
-p 在等待read輸入是,輸出的提示信息;
-t 指定等待時間
-n 接受指定的字符數
-s 隱藏輸入的數據
$ 當變量復制完成后,在變量前面加$來獲取變量的值。
練習二:判斷當前用戶是不是root
#!/bin/bash d=`whoami` if [ $d == "root" ] then echo "The user is root" else echo "The user is guest" fi
或者
#!/bin/bash if [ $USER == "root" ] then echo "The user is root" else echo "The user is guest" fi
用到的知識點:
字符串的比較 等於 == 不等於 !=
關於 [] bash 的內部命令, [ 和 test 是等同的。Test和[]中可用的比較運算符只有==和!=,兩者都是用於字符串比較的,不可用於整數比較,整數比較只能使用-eq,-gt這種形式。無論是字符串比較還是整數比較都不支持大於號小於號。因為[ 是Linux內部命令,所以 [ a+b ]之間要有空格。
練習三:統計下面地址出現的次數,並且從大到小排序
http://192.168.110.112/index.html http://192.168.10.9/index.html http://192.168.120.187/index.html http://192.168.1.112/index.html http://192.168.120.112/index.html http://192.168.10.9/index.html http://192.168.120.187/index.html http://192.168.10.9/index.html [root@mysql shell]# cat cathttp.txt | cut -d '/' -f 3 |sort | uniq -c | sort -nr
用到的知識點:
cut 從標准輸入的文本剪切列或者區域,不能用空格分隔
參數:
-c 指定剪切的字符數
-f 指定剪切的區域
-d 指定區域分隔符
sort 以行為單位進行排序
參數:
-g 按照一般數值排序
-r 反向排序
-n 根據字符串數值排序
uniq 用於檢查刪除文本中重復出現的行列
-c 在每行前顯示重復出現的次數
-d 僅顯示重復出現的行列
-u 僅顯示出現一次的行列
-D 顯示所有重復的所有行
練習四:統計連接到服務器的每個ip的情況,並按照從打到小排序
[root@mysql shell]# netstat -an | grep ESTABLISHED | awk -F " " '{print $5}'| awk -F ":" '{print $1}' | sort | uniq -c | sort -rn 3 192.168.110.1
用到的知識點:
awk 文本處理
參數: -F 指定分隔
練習五:找出訪問量排在前兩位的
192.168.110.20 aa.html 192.168.110.60 aa.html 192.168.110.40 aa.html 192.168.110.70 aa.html 192.168.110.20 aa.html 192.168.110.90 aa.html 192.168.110.70 aa.html 192.168.110.110 aa.html 192.168.110.20 aa.html 192.168.110.130 aa.html 192.168.110.19 aa.html 192.168.110.26 aa.html 192.168.110.26 aa.html 192.168.110.70 aa.html
[root@mysql shell]# cat didi.text | awk -F " " '{print $1}'| sort | uniq -c | sort -nr | head -2 3 192.168.110.70
3 192.168.110.20
用到的知識點:
head 輸出前幾行
參數:
-n 2 輸出前兩行
-c4 輸出前四個字符
練習五:統計服務器進程(只是練習)
ss -na | egrep ^tcp| awk -F " " '{print $5}' | egrep ^1|sort | uniq -c | sort -k2n
新的知識點:
ss命令:ss是Socket Statistics的縮寫。顧名思義,ss命令可以用來獲取socket統計信息,它可以顯示和netstat類似的內容。ss的優勢在於它能夠顯示更多更詳細的有關TCP和連接狀態的信息,而且比netstat更快速更高效。
-n 不顯示服務名稱
-a 顯示所有
sort 命令 -k2 按照第二個字符排序 -n 按照數值大小排序
練習六
將文本1.txt的第二列累加
zhang1 30
li 40
teng 70
sun 55
bao 65
cat 33.txt |awk -F " " '{sum+=$2} END {print sum}'
練習七:將文本中無序的數排列后打印並求出總和打印
12 23 56 44 77 6 55 99 5 23
sort -n number.txt | awk '{print $1} {sum+=$1} END {print sum}'
sort命令,根據文本的內容,以行為單位來排序。
參數 -u 去重
-r 降序
-n 以數值排序
-t 指定分隔符
-k 指定列
awk $0 打印整行內容 $1第一個字段
練習八:查出/home下文件中包含字符"cat" 的文件名稱
[root@localhost ~]# grep -r cat /home | awk -F " " '{print $2}' /home/xuexi/.cache/tracker/meta.db /home/xuexi/.cache/tracker/meta.db-wal /home/xuexi/.cache/tracker/ontologies.gvdb /home/xuexi/.config/dconf/user /home/xuexi/.local/share/tracker/data/tracker-store.journal /home/xuexi/.local/share/tracker/data/tracker-store.ontology.journal jacktxt.txt jacktxt.txt
grep -r 以符號形式遞歸地讀取每個目錄下的所有文件
練習九:輸入兩個數求這兩個數的和以及乘積
#!/bin/bash read -p "Inpute first number :" num1 read -p "Inpute second number :" num2 sum=$[$num1+$num2] product=$[$num1*num2] echo "sum is $sum" echo "product is $product"
練習十:判斷一個文件大小
#!/bin/bash line=`cat /etc/inittab|wc -l` if [ $line -gt 100 ] then echo "inittab is big file" else echo "inittab is small file" fi
練習十一:用戶判斷
#!/bin/bash
checkuser(){
user=`whoami`
if [ $user = tom ]
then
echo
else
echo "can not execute by user ${USER}"
echo -e "\033[41;37m 不能執行操作,請使用tom \033[0m"
exit 1
fi
}
checkuser
知識點:
$() 將小括號的命令執行,結果賦值給變量 a=$(ls)
${} 變量替換,精確的界定變量范圍 例如: A=B echo $AB 想輸出$A 然后后面跟個B ,但是輸出的是 $AB,用 echo ${A}B 則輸出BB
\033 格式: echo -e "\033[字背景顏色;字體顏色m字符串\033[0m"
exit 0 用echo $?查看則返回0 ,表示程序正確結束 ; exit 1 用echo $? 查看輸出 1 程序沒有正確結束
echo -e 處理特殊字符
練習十二:統計文本中的空白行
#!/bin/bash line=`grep "^$" /etc/inittab |wc -l` if [ $line -gt 0 ] then echo "有空行" grep -n "^$" /etc/inittab else ehco "沒有空行" fi
練習十三:定時備份/var/spool/mail下的文件
#!/bin/bash sj=`date +%Y%m%d-%H-%M-%S` # echo $sj fn='mail_'$sj'.tar.gz' #echo $fn cd /var/spool/mail && tar -zcvf /home/test3/"$fn" * >/etc/null
crontab -e
30 22 * * * /root/shell/mail.sh
練習十三:輸入一個用戶名,獲取密碼警告期限;然后判斷用戶最近一次修改密碼的時間距離今天是否已經小於警告期限;
[root@mysql shell]# vi mima.sh #!/bin/bash read -p "請輸入一個用戶" user #距離密碼有效期的第 7 天開始,每次登錄系統都會向該賬戶發出 "修改密碼" 的警告信息 W=`grep $user /etc/shadow | cut -d: -f6` #date +%s //從 1970 年 1 月 1 日 00:00:00 UTC 到目前為止的秒數(時間戳) S=`date +%s` #計算天數 T=`expr $S / 86400` #密碼有效天數 L=`grep $user /etc/shadow | cut -d: -f5` #最后一次修改時間 N=`grep $user /etc/shadow |cut -d: -f3` NY=$[$L-$[$T-$N]] if [ $NY -lt $W ] then echo "Waring" else echo "OK" exit 0 fi
date +%s //從 1970 年 1 月 1 日 00:00:00 UTC 到目前為止的秒數(時間戳)
expr 命令,一款多功能計算器
一起學習的朋友可以聯系我: