筆試練習(二):
11、寫一個shell腳本來得到當前的日期,時間,用戶名和當前工作目錄。
[root@VM_0_5_centos test]# vi 11.sh [root@VM_0_5_centos test]# cat 11.sh #!/bin/bash echo "Hello, $LOGNAME" echo "Current date is `date`" echo "User is `who i am`" echo "Current directory `pwd`"
[root@VM_0_5_centos test]# sh 11.sh Hello, root Current date is Tue Jul 24 11:35:23 CST 2018 User is root pts/0 2018-07-24 11:34 (222.211.249.187) Current directory /test
12、編寫shell腳本獲取本機的網絡地址。
[root@VM_0_5_centos ~]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.27.0.5 netmask 255.255.240.0 broadcast 172.27.15.255 ether 52:54:00:34:12:97 txqueuelen 1000 (Ethernet) RX packets 18464043 bytes 1387072767 (1.2 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1111041544 bytes 1128965265141 (1.0 TiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1 (Local Loopback) RX packets 343083420 bytes 34242325784 (31.8 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 343083420 bytes 34242325784 (31.8 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@VM_0_5_centos test]# vi 12.sh [root@VM_0_5_centos test]# cat 12.sh #!/bin/bash #This script print ip and network IP=`ifconfig eth0 | grep 'inet ' | sed 's/^.*inet//g'| sed 's/ netmask.*$//g'` NETMASK=`ifconfig eth0 | grep 'inet '| sed 's/^.*netmask//g' | sed 's/broadcast.*$//g'` echo "IP is $IP" echo "NETMASK is $NETMASK" exit 0 [root@VM_0_5_centos test]# sh 12.sh IP is 172.27.0.5 NETMASK is 255.255.240.0
13、編寫個shell腳本將當前目錄下大於10K的文件轉移到/tmp目錄下:
[root@VM_0_5_centos test]# vi 13.sh [root@VM_0_5_centos test]# cat 13.sh #/bin/bash # Using for move currently directory lt 10k file to /tmp for FileName in `ls -l | awk '$5>10240 {print $9}'`; do mv $FileName /tmp done ls -al /tmp echo "Done! "
14、編寫一個名為myfirstshell.sh的腳本,它包括以下內容:
a) 包含一段注釋,列出您的姓名、腳本的名稱和編寫這個腳本的目的。 b) 問候用戶。 c) 顯示日期和時間。 d) 顯示這個月的日歷。 e) 顯示您的機器名。 f) 顯示當前這個操作系統的名稱和版本。 g) 顯示父目錄中的所有文件的列表。 h) 顯示root正在運行的所有進程。 i) 顯示變量TERM、PATH和HOME的值。 j) 顯示磁盤使用情況。 k) 用id命令打印出您的組ID。 m) 跟用戶說“Good bye”
[root@VM_0_5_centos test]# vi 14.sh [root@VM_0_5_centos test]# cat 14.sh #!/bin/bash user=`whoami` case $user in root) echo "hello root";; mmzs) echo "hello mmzs";; *) echo "hello $user,welcome" esac echo "日期和時間: `date`" echo "本月的日歷: `cal`" echo "本機的機器名:`uname -n`" echo "當前這個操作系統的名稱和版本:`uname -s;uname -r`" echo "變數TERM的值:$TERM" echo "變數PATH的值:$PATH" echo "變數HOME的值:$HOME" echo "磁盤的使用情況:`df`" echo "用id命令打印出你的組ID:`id -g`" echo "root正在運行的所有進程:` ps -u root`" echo "父目錄中的所有文件的列表:`ls ../`" echo "Good bye!" exit 0 [root@VM_0_5_centos test]# sh 14.sh hello root 日期和時間: Thu Jul 26 14:40:40 CST 2018 本月的日歷: July 2018 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 本機的機器名:VM_0_5_centos 當前這個操作系統的名稱和版本:Linux 3.10.0-693.el7.x86_64 變數TERM的值:xterm 變數PATH的值:/usr/local/mongodb3.0.6/bin:/usr/local/node/8.11.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/software/jdk1.7.0_79/bin:/software/jdk1.7.0_79/lib:/root/bin 變數HOME的值:/root 磁盤的使用情況:Filesystem 1K-blocks Used Available Use% Mounted on /dev/vda1 51474024 45832784 3335164 94% / devtmpfs 932328 0 932328 0% /dev tmpfs 941808 24 941784 1% /dev/shm tmpfs 941808 384 941424 1% /run tmpfs 941808 0 941808 0% /sys/fs/cgroup tmpfs 188364 0 188364 0% /run/user/0 用id命令打印出你的組ID:0 root正在運行的所有進程: PID TTY TIME CMD 1 ? 00:00:15 systemd 2 ? 00:00:00 kthreadd 3 ? 00:02:05 ksoftirqd/0 5 ? 00:00:00 kworker/0:0H ……等等 父目錄中的所有文件的列表:bin boot data dev etc home install lib lib64 opt proc root run sbin ……等等 Good bye!
15、文件移動拷貝,有m1.txt m2.txt m3.txt m4.txt,分別創建出對應的目錄,m1 m2 m3 m4 並把文件移動到對應的目錄下。
[root@VM_0_5_centos test]# vi 15.sh [root@VM_0_5_centos test]# cat 15.sh #!/bin/bash touch m1.txt m2.txt m3.txt m4.txt I=1 while [ $I -le 4 ]; do mkdir m$I mv m$I.txt m$I I=$((I+1)) done [root@VM_0_5_centos test]# sh 15.sh [root@VM_0_5_centos test]# ll total 32 -rw-r--r-- 1 root root 128 Jul 26 14:05 11.sh -rw-r--r-- 1 root root 271 Jul 26 14:15 12.sh -rw-r--r-- 1 root root 635 Jul 26 14:40 14.sh -rw-r--r-- 1 root root 131 Jul 26 15:03 15.sh drwxr-xr-x 2 root root 4096 Jul 26 15:03 m1 drwxr-xr-x 2 root root 4096 Jul 26 15:03 m2 drwxr-xr-x 2 root root 4096 Jul 26 15:03 m3 drwxr-xr-x 2 root root 4096 Jul 26 15:03 m4 [root@VM_0_5_centos test]# cd m1/ [root@VM_0_5_centos m1]# ll total 0 -rw-r--r-- 1 root root 0 Jul 26 15:03 m1.txt
16、root用戶今天登陸了多長時間?
[root@VM_0_5_centos m1]# vi 16.sh [root@VM_0_5_centos m1]# cat 16.sh #! /bin/sh cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("系統已運行:%d天%d時%d分%d秒\n",run_days,run_hour,run_minute,run_second)}' [root@VM_0_5_centos m1]# sh 16.sh 系統已運行:1天21時53分19秒
17、終端輸入一個文件名,判斷是否是設備文件?
[root@VM_0_5_centos test]# vi 17.sh [root@VM_0_5_centos test]# cat 17.sh #/bin/bash echo -e "The program will Judge a file is or not a device file.\n\n" read -p "Input a filename:" filename if [ -b $filename -o -c $filename ]; then echo "$filename is a device file" exit 0 else echo "$filename is not a device file" exit 1 fi
18、統計IP訪問:要求分析apache訪問日志,找出訪問頁面數量在前100位的IP數。日志大小在78M左右。
以下是apache的訪問日志節選:
202.101.129.218 - - [26/Mar/2006:23:59:55 +0800] "GET /online/stat_inst.php?pid=d065 HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
[root@VM_0_5_centos test]# mkdir -p 18 [root@VM_0_5_centos test]# mv 18.sh access.log 18 [root@VM_0_5_centos test]# cd 18 [root@VM_0_5_centos 18]# vi 18.sh [root@VM_0_5_centos 18]# cat 18.sh #! /bin/bash # $1 為要測試的日志文件 awk '{print $1}' $1 | sort | uniq -c | sort -k1nr | head -n3 [root@VM_0_5_centos 18]# ll total 20 -rw-r--r-- 1 root root 108 Aug 6 14:58 18.sh -rw-r--r-- 1 root root 14372 May 20 2015 access.log [root@VM_0_5_centos 18]# cat access.log 192.168.1.108 - - [23/Dec/2014:06:56:49 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3" 省略更多訪問記錄…… [root@VM_0_5_centos 18]# sh 18.sh access.log 34 127.0.0.1 16 192.168.1.108 13 192.168.6.254 [root@VM_0_5_centos 18]#
19、設計一個Shell程序,在/userdata目錄下建立50個目錄,即user1~user50,並設置每個目錄的權限,其中其他用戶的權限為:讀;文件所有者的權限為:讀、寫、執行;文件所有者所在組的權限為:讀、執行。
[root@VM_0_5_centos test]# mkdir -p 19 [root@VM_0_5_centos test]# cd 19 [root@VM_0_5_centos 19]# vi 19.sh [root@VM_0_5_centos 19]# cat 19.sh #!/bin/bash # 需要root權限 echo "create /test/19/tset" #為方便測試,將/userdata目錄修改為/test/19/tset mkdir /test/19/tset if [ $? -eq 0 ]; then i=1 while [ $i -le 50 ]; do mkdir -p /test/19/test/user$i chmod 754 /test/19/test/user$i let i++ done else echo "bye" exit 1 fi exit 0 [root@VM_0_5_centos 19]# sh 19.sh create /usrdata [root@VM_0_5_centos 19]# cd /test/19/test [root@VM_0_5_centos test]# ll total 200 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user1 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user10 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user11 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user12 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user13 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user14 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user15 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user16 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user17 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user18 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user19 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user2 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user20 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user21 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user22 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user23 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user24 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user25 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user26 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user27 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user28 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user29 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user3 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user30 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user31 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user32 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user33 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user34 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user35 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user36 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user37 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user38 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user39 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user4 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user40 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user41 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user42 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user43 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user44 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user45 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user46 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user47 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user48 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user49 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user5 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user50 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user6 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user7 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user8 drwxr-xr-- 2 root root 4096 Aug 6 15:03 user9 [root@VM_0_5_centos test]#
20、設計一個shell程序,添加一個新組為class1,然后添加屬於這個組的30個用戶,用戶名的形式為stdxx,其中xx從01到30,並設置密碼為對應的stdxx。
[root@VM_0_5_centos test]# vi 20.sh [root@VM_0_5_centos test]# cat 20.sh #!/bin/bash #設計一個shell程序,添加一個新組為class1,然后添加屬於這個組的30個用戶,用戶名的形式為stdxx,其中xx從01到30。 #請 su root 或者 sudo su 變成root用戶 groupadd class1 for i in {9901..9930}; do xx=`echo $i | sed 's/99//g'` useradd -g class1 -s /bin/bash -d /home/std$xx -m std$xx echo -e "std$xx\nstd$xx" | passwd std$xx echo -e "user std$xx password is std$xx" >> /root/newuser.txt done
獲取腳本
注:所有腳本均可通過關注右側公眾號,后台回復"shell編程練習"獲取百度網盤鏈接。