Linux實戰——Shell編程練習(更新12題)

1.公鑰批量分發

shell 實現 100 臺服務器的公鑰的批量分發;LLD 規劃:100 臺服務器 ip 爲:192.168.42.101-201,root 密碼:123456。

#遠程機器的用戶名和密碼
password=123456
username=root
#將本機的公鑰複製到遠程機器的authorized_keys文件中
main(){
sshpass -p $password ssh-copy-id -o StrictHostKeyChecking=no [email protected].$1 >/dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "192.168.42.$1 is successful..."
fi
}
#檢查sshpass工具是否安裝
basecheck(){
which sshpass >/dev/null 2>&1
if [ $? -ne 0 ]
then
    yum install sshpass -y >/dev/null 2>&1
fi
}
#檢查網絡是否暢通,若通暢則發送ssh公鑰
netcheck(){
for j in {101..201}
do
    ping -c 1 192.168.42.$j >/dev/null 2>&1
    if [ $? -eq 0 ]
    then
        main $j
    else
        echo "192.168.42.$j 網絡不通暢..."
    fi
    done
}
basecheck
netcheck

2.網址中的域名統計

處理以下文件內容,將域名取出並進行計數排序。

http://www.baidu.com/index.html
http://www.baidu.com/1.html
http://post.baidu.com/index.html
http://mp3.baidu.com/index.html
http://www.baidu.com/3.html
http://post.baidu.com/2.html

得到如下結果:

域名出現的次數 域名
2 www.baidu.com
2 post.baidu.com
1 mp3.baidu.com
cat <<EOF
域名出現的次數 域名
EOF
array=(
"http://www.baidu.com/index.html"
"http://www.baidu.com/1.html"
"http://post.baidu.com/index.html"
"http://mp3.baidu.com/index.html"
"http://www.baidu.com/3.html"
"http://post.baidu.com/2.html"
)
#檢查臨時域名文件是否存在,存在則刪除
check(){
test -f yuming.txt
if [ $? -eq 0 ]
then
    rm -rf yuming.txt
fi
}
#域名統計處理及結果輸出
operate(){
for var in ${array[@]}
do
    echo $var >> yuming.txt
done
awk -F '/' '{print $3}' yuming.txt |sort -r|uniq  -c
}
check
operate
check

其他方法

cut -d / -f3 file.txt |sort -r |uniq -c
awk -F "/"'{S[$3]=S[$3]+1}END{for(k in S) print k,S[k]}' file.txt|sort -r
sed -r 's#http://(.*)/.*#\1#g' file.txt |sort -r|uniq -c

3.shell+定時計劃任務:歸檔備份

設計一個 shell 程序,在每天凌晨壓縮打包/etc 目錄下的所有內容,存放在/root/bak 目錄裏,且文件名爲如下形式 yymmdd_etc.tar.gz(yy 爲年,mm 爲月,dd 爲日),該目錄保存 7 天內容;Shell 程序 fileback 存放在/usr/bin 目錄下。

day="`date +%Y%m%d`"
dir=/root/bak
backupdir="`date +%Y%m%d`_etc.tar.gz"
#查看/root/bak目錄是否存在,如果不存在,則創建目錄
checkbak(){
if [ ! -e $dir ]
then
    mkdir $dir
fi
}
#壓縮打包/etc目錄下,存放在/root/bak目錄裏
backup(){
tar -zcvf /root/bak/$backupdir /etc/ > /dev/null 2>&1
echo "$backupdir 壓縮打包成功 successful"
}
#清除7天前的過期文件
clean(){
find $dir -mtime +7 -exec rm -rf {} \;
if [ $? -eq 0 ]
then
    echo "過期數據清除成功 successful"
else
    echo "$day 過期數據清理失敗 error,請及時關注"
fi
}
checkbak
backup
clean

4.shell開發運維管理工具(1)

shell 開發運維管理工具,要求:用戶交互,當用戶輸入菜單號時,打印相關內容。

菜單
1. 磁盤分區
2. CPU 負載
3. 剩餘內存
4. 退出
輸入:1
輸出:(主機名,系統版本,分區情況)
hostname:
system:系統版本
---------分區一-----------(分區變量輸出)
path:分區一
size:大小
file_os:分區文件系統類型
mount_on:分區掛載點
----------分區二----------
path:分區二
size:大小
file_os:分區文件系統類型
mount_on:分區掛載點
輸入:2
輸出:
1 分鐘平均負載:
5 分鐘平均負載:
15 分鐘平均負載:
輸入:3
輸出:
目前可用內存:
可用 Swap 分區:
輸入:4
輸出:
Bey…
cat <<EOF
---------------------------
        1.磁盤分區
        2.CPU負載
        3.剩餘內存
        4.退出
---------------------------
EOF
while true
do
read -p "請選擇功能(1~4):" num
case $num in
    1)
        echo "hostname:   `cat /etc/hostname | awk 'BEGIN{FS="."}{print $1}'`"
        echo "system:   `uname -r`"
        echo "------------------/dev/sda1--------------------------"
        echo "path:`df -h | awk 'BEGIN{FS=" "}/^\/dev\/sda1/{print $1}'`"
        echo "size:`df -h | awk 'BEGIN{FS=" "}/^\/dev\/sda1/{print $2}'`"
        echo "file_os:`df -T | awk 'BEGIN{FS=" "}/^\/dev\/sda1/{print $2}'`"
        echo "mount_on:`df -h | awk 'BEGIN{FS=" "}/^\/dev\/sda1/{print $6}'`"
        echo "------------------/dev/sda2--------------------------"
        echo "path:`df -h | awk 'BEGIN{FS=" "}/^\/dev\/sda2/{print $1}'`"
        echo "size:`df -h | awk 'BEGIN{FS=" "}/^\/dev\/sda2/{print $2}'`"
        echo "file_os:`df -T | awk 'BEGIN{FS=" "}/^\/dev\/sda2/{print $2}'`"
        echo "mount_on:`df -h | awk 'BEGIN{FS=" "}/^\/dev\/sda2/{print $6}'`"
       ;;
    2)
        echo "1分鐘平均負載:`uptime | awk 'BEGIN{FS="[ |,]"}{print $14}'`"
        echo "10分鐘平均負載:`uptime | awk 'BEGIN{FS="[ |,]"}{print $16}'`"
        echo "15分鐘平均負載:`uptime | awk 'BEGIN{FS="[ |,]"}{print $18}'`"
        ;;
    3)
        echo "目前可用內存:`free -h | awk 'BEGIN{FS=" "} /^M/ {print $4}'`"
        echo "可用Swap分區:`free -h | awk 'BEGIN{FS=" "} /^S/ {print $4}'`"
        ;;
    4)
        exit 0
        ;;
    *)
        echo "請輸入正確的菜單項!"
esac
done

5.shell解決就餐問題

shell 編程完成以下需求。

1 食堂:中國人(人民幣)
2 食堂:外國人(美元)
匯率 6.798
菜單:
宮保雞丁 (1)(葷): 8.6
魚香肉絲 (2)(葷):2.5
豆芽炒青菜 (1)(素):5.5
椒鹽蘑菇 (2)(素):1.9

倘若一哥們每天必須喫一個肉一個素;用腳本實現搭配的最低消費。

array=(
"宮保雞丁 (1)(葷):8.6"
"魚香肉絲 (2)(葷):2.5"
"豆芽炒青菜 (1)(素):5.5"
"椒鹽蘑菇 (2)(素):1.9"
)
#檢查臨時菜單是否存在,存在則刪除
check(){
test -f caidan.txt
if [ $? -eq 0 ]
then
    rm -rf caidan.txt
fi
test -f file01.tmp
if [ $? -eq 0 ]
then
    rm -rf file01.tmp
fi
}
#創建臨時菜單文件
create(){
for var in ${array[@]}
do
    echo $var >> caidan.txt
done
}
#菜單文件處理及結果輸出
operate(){
array01=(`cat caidan.txt |grep \(2\)`)
b=`cat caidan.txt |grep \(1\)`
a=`for j in ${array01[@]};do echo $j;done |awk -F: -v OFS=':' '{print $1,$2*6.798}'`
for i in $b
do
    echo $i >> file01.tmp
done
for j in $a
do
    echo $j >> file01.tmp
done
array02=(`cat file01.tmp |grep \(葷\)`)
array03=(`cat file01.tmp |grep \(素\)`)
c=`for k in ${array02[@]};do echo $k;done |sort -n -k2 |head -1`
d=`for z in ${array03[@]};do echo $z;done |sort -n -k2 |head -1`
echo $c
echo $d
}
check
create
operate
check

6.shell開發運維管理工具(2)

編寫1個彈出式菜單的shell程序並實現其簡單的菜單功能

*******************************************************
*                         MENU                          *
*         1.copy                   2.rename             *
*         3.remove                 4.find               *
*                          5.exit                       * 
*******************************************************

用戶按下數字1,則提示用戶輸入源和目的文件名後執行復制;輸入數字2,則提示用戶輸入要更名的文件或目錄後執行更名操作;輸入數字3,則提示用戶輸入要刪除的文件並執行刪除操作;輸入數字4,則提示用戶輸入要查找的文件並執行查找操作;輸入數字5,則退出該菜單shell程序的執行。

#shell實現複製、重命名、刪除、查找
cat << EOF
*******************************************************
*                         MENU                        *
*         1.copy                   2.rename           *
*         3.remove                 4.find             *
*                          5.exit                     *
*******************************************************
EOF
output(){
if [ $1 -eq 0 ]
then
    echo "success"
else
    echo "fail"
fi
}
while true
do
read -p "請選擇功能(0-5):" num
case $num in
    1)
        read -p "請輸入源和目的文件名(絕對路徑):" s d
        cp -r $s $d
        output $?
        ;;
    2)
        read -p "請輸入要更名的文件或目錄(絕對路徑):" old new
        mv $old $new
        output $?
        ;;
    3)
        read -p "請輸入要刪除的文件(絕對路徑):" filename
        rm -rf $filename
        output $?
        ;;
    4)
        read -p "請輸入要查找的文件:" name
        find / -name $name
        ;;
    5)
        exit
        ;;
    *)
        echo "請輸入數字0-5!"
esac
done

在這裏插入圖片描述

7.自動刪除用戶賬號

編寫shell程序,實現自動刪除50個用戶賬號的功能,賬號名爲stud1至stud50

#自動刪除50個用戶賬號
j=0
for i in `seq 1 50`
do
    userdel -r stud$i &>/dev/null
    if [ $? -eq 0 ]
    then
        j=$(($j+1))
    else
        echo "用戶賬號stu$i不存在"
    fi
done
echo "$j個用戶賬號刪除完畢,$(($i-$j))個用戶賬號不存在"

刪除5個賬號測試:
在這裏插入圖片描述

8.九九乘法表

#九九乘法表
for((i=1;i<=9;i++))
do
    for((j=1;j<=i;j++))
    do
#        echo -ne "$i*$j=$(($i*$j))\t"
        echo -ne "$(($i*$j))\t"
    done
    echo ""
done

9.文本處理面試題

(1)[騰訊面試題]:一個文本類型的文件,裏面每行存放一個登陸者的IP(某些行是重複的),寫一個shell腳本輸出登陸次數最多的用戶。
Ip_input.txt的內容假設如下:
219.217.49.14
175.43.4.87
87.48.98.1
59.73.38.25
219.217.50.14
59.92.48.32
219.217.49.14
59.72.38.142
59.73.38.25
219.217.49.14

#!/bin/bash
echo "登陸次數最多的用戶IP爲:`sort Ip_input.txt|uniq -c|sort -nr|awk '{print $2}'|head -n 1`"

(2)騰訊shell試題
假設qq.tel文件內容:
12334:13510014336
12345:12334555666
12334:12343453453
12099:13598989899
12334:12345454545
12099:12343454544
請分類如下:
[12334]
13510014336
12343453453
...........
[12099]
13598989899
12343454544
............
sort qq.tel|awk -F: '{if(tmp!=$1){tmp=$1;print "["tmp"]";}print $2}'
(3) 文件內容如下:
100
a 100
b -50
c -20
d -30
要求輸出結果爲:
100
a 100
200
b -50
150
c -20
130
d -30
awk 'NR==1{sum=$1;print $0}NR!=1{print $0;sum=sum-$2;print sum}' file
(4)文件內容如下:
123abc456
456def123
567abc789
789def567
要求輸出:
456ABC123
123DEF456
789ABC567
567DEF789
sed -r 's/([1-9]{3})([a-f]{3})([1-9]{3})/\3\2\1/;y/abcdef/ABCDEF/' file
(5)文件內容如下
1.1.1.1 11
1.1.1.1 22
1.1.1.1 33
1.1.1.1 44
2.2.2.2 11
2.2.2.2 22
2.2.2.2 33
2.2.2.2 44
要求使用awk將文件輸出:
1.1.1.1 11 22 33 44
2.2.2.2 11 22 33 44
awk '{sum[$1]=sum[$1]" "$2}END{for(var in sum)print var sum[var]}' file

10.判斷一個指定的腳本是否有語法錯誤

寫一個腳本,判斷一個指定的腳本是否是語法錯誤。如果有錯誤,則提醒用戶鍵入Q或者q:無視錯誤並退出;其它任何鍵可以通過vim打開這個指定的腳本。

#!/bin/bash
read -p "please input check script:" file
if [ -f $file ]
then
    sh -n $file >/dev/null 2>&1
    if [ $? -ne 0 ]
    then
        read -p "you input $file syntax error,[Type q/Q to exit or Type other to edit]" answer
        case $answer in
            Q|q)
                exit 0
                ;;
            *)
                vim $file
                ;;
        esac
    fi
else
    echo $file is not exist
    exit 1
fi

11.wget下載管理

創建一個函數,能接受兩個參數:
1)第一個參數爲URL,即可下載的文件;第二個參數爲目錄,即下載後保存的位置;
2)如果用戶給的目錄不存在,則提示用戶是否創建;如果創建就繼續執行,否則,函數返回一個51的錯誤值給調用腳本;
3)如果給的目錄存在,則下載文件;下載命令執行結束後測試文件下載成功與否;如果成功,則返回0給調用腳本,否則,返回52給調用腳本;

#!/bin/bash
#根據用戶輸入創建保存目錄或退出執行
checkmk(){
if [ $2 == "y" ]
then
    mkdir -p $1
    tmp2=0
elif [ $2 == "n" ]
then
    tmp2=51
else
    echo "[y/n]輸入錯誤error"
fi
return $tmp2
}
#檢查下載保存目錄是否存在,若存在則下載,否則詢問是否創建保存目錄
checkdir(){
if [ -d $1 ]
then
    tmp=0
else
    tmp=51
    read -p "是否要創建目錄$1[y/n]?" answer
    checkmk $1 $answer
    temp=$?
    if [ $temp -ne 0 ]
    then
    echo "用戶不同意創建目錄,錯誤碼:$temp"
    else
        tmp=0
        echo "$1目錄創建成功"
    fi
fi
return $tmp
}
#下載文件
download(){
checkdir $2
tmp1=$?
if [ $tmp1 -eq 0 ]
then
    wget -P $2 -rnd $1 >/dev/null 2>&1
    if [ $? -eq 0 ]
    then
        tmp2=0
    else
        tmp2=52
    fi
fi
return $tmp2
}
#主函數接受兩個參數:URL和目錄
main(){
download $1 $2
if [ $? -eq 0 ]
then
    echo "wget is successful"
else
    echo "wget is error,錯誤碼:52"
fi
}
main $1 $2

在這裏插入圖片描述

12.解壓縮程序

編寫一個shell程序,分別能夠解壓gz、bz2、xz和zip格式文件,其他文件給出提出信息“不認識文件類型”
建立測試文件:
# tar czvf a.tar.gz *.sh
# tar cjvf b.tar.bz2 *.sh
# tar cJvf c.tar.xz *.sh
# zip d.zip *.sh

#!/bin/bash
check(){
if [ $1 -eq 0 ]
then
    echo "$file decompressed successfully"
else
    echo "$file decompressed failed"
fi
}
read -p "請輸入要解壓文件的名稱:" file
if [ -f $file ]
then
    case $file in
        *gz)
            tar xzvf $file >/dev/null
            check $?
        ;;
        *bz2)
            tar xjvf $file >/dev/null
            check $?
        ;;
        *xz)
            tar xJvf $file >/dev/null
            check $?
        ;;
        *zip)
            unzip -n $file >/dev/null
            check $?
        ;;
         *)
            echo "文件格式不正確,無法解壓"
    esac
else
    echo "$file文件不存在"
fi

在這裏插入圖片描述

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