shell練習題(一)


練習一:求兩個數的和

#/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 命令,一款多功能計算器

一起學習的朋友可以聯系我:

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM