練習:
1 、找出ifconfig 命令結果中本機的IPv4 地址
思路:我們使用ifconfig命令可知,ip地址是在第二行,所以我們先篩選出第二行,
第二行中的分隔符看起來很混亂,都是不規則的,有一個空格或多個空格的,沒有標準
所以我們最好是建立一個標準分隔,好規范管理,,最后選出ip地址所在的列就可以了
[root@localhost ~]# ifconfig |head -n2 ==>顯示前面輸出的前兩行,包含有ip地址的那一行 eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.18.18.65 netmask 255.255.255.0 broadcast 172.18.18.255 [root@localhost ~]# ifconfig |head -n2|tail -n1 ==>同上原理,顯示只包含ip地址的行 inet 172.18.18.65 netmask 255.255.255.0 broadcast 172.18.18.255 [root@localhost ~]# ifconfig |head -n2|tail -n1|tr " " ":" ==>建立標準分隔符,將默認分隔符“ ”改為容易識別的":" ::::::::inet:172.18.18.65::netmask:255.255.255.0::broadcast:172.18.18.255 [root@localhost ~]# ifconfig |head -n2|tail -n1|tr " " ":"|tr -s ":" ==>進一步簡化,刪除所有重復的字符以單獨一個字符表示,使之更容易識別 :inet:172.18.18.65:netmask:255.255.255.0:broadcast:172.18.18.255 [root@localhost ~]# ifconfig |head -n2|tail -n1|tr " " ":"|tr -s ":"|cut -d: -f3 ==>以“:”為分隔符,選擇第三列就是我們要選的ip地址 172.18.18.65 [root@localhost ~]#
2 、查出分區空間使用率的最大百分比值
思路:和上面類似,以下輸出分隔符混亂,看都看暈了,所以一樣的要建立一個標準分隔符,好規范管理,取出使用率列后,
按照數字大小排序,取最大的那個一行就可以得到最大空間使用率的百分比值了 ,如下
[root@localhost ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 41922560 812752 41109808 2% / devtmpfs 486268 0 486268 0% /dev tmpfs 500664 0 500664 0% /dev/shm tmpfs 500664 6832 493832 2% /run tmpfs 500664 0 500664 0% /sys/fs/cgroup /dev/sda3 20961280 3269760 17691520 16% /usr /dev/sda1 496300 140252 356048 29% /boot tmpfs 100136 0 100136 0% /run/user/0 [root@localhost ~]# df|tr " " ":" ==>建立標準分隔符,將默認分隔符“ ”改為容易識別的":" Filesystem:::::1K-blocks::::Used:Available:Use%:Mounted:on /dev/sda2:::::::41922560::812752::41109808:::2%:/ devtmpfs::::::::::486268:::::::0::::486268:::0%:/dev tmpfs:::::::::::::500664:::::::0::::500664:::0%:/dev/shm tmpfs:::::::::::::500664::::6832::::493832:::2%:/run tmpfs:::::::::::::500664:::::::0::::500664:::0%:/sys/fs/cgroup /dev/sda3:::::::20961280:3269760::17691520::16%:/usr /dev/sda1:::::::::496300::140252::::356048::29%:/boot tmpfs:::::::::::::100136:::::::0::::100136:::0%:/run/user/0 [root@localhost ~]# df|tr " " ":"|tr -s ":" ==>進一步簡化,刪除所有重復的字符以單獨一個字符表示,使之更容易識別 Filesystem:1K-blocks:Used:Available:Use%:Mounted:on /dev/sda2:41922560:812752:41109808:2%:/ devtmpfs:486268:0:486268:0%:/dev tmpfs:500664:0:500664:0%:/dev/shm tmpfs:500664:6832:493832:2%:/run tmpfs:500664:0:500664:0%:/sys/fs/cgroup /dev/sda3:20961280:3269760:17691520:16%:/usr /dev/sda1:496300:140252:356048:29%:/boot tmpfs:100136:0:100136:0%:/run/user/0 [root@localhost ~]# df|tr " " ":"|tr -s ":"|cut -d: -f5 ==>以“:”為分隔符,第5列就是空間使用率 Use% 2% 0% 0% 2% 0% 16% 29% 0% [root@localhost ~]# df|tr " " ":"|tr -s ":"|cut -d: -f5|sort -rn ==>將空間使用率案數字大小排序 29% 16% 2% 2% Use% 0% 0% 0% 0% [root@localhost ~]# df|tr " " ":"|tr -s ":"|cut -d: -f5|sort -rn|head -n1 ==>只顯示第一行即空間使用率最大的一行 29% [root@localhost ~]# df|tr " " ":"|tr -s ":"|cut -d: -f5|sort -rn|head -n1|tr -d "%" ==>去掉“%”,得到分區空間使用率的最大百分比值 29
3 、查出用戶UID 最大值的用戶名、UID 及shell 類型
思路:查看/etc/passwd文件可知,文件內容是使用“:”做分隔符的,開心啊..,我們要查看UID最大的的用戶信息,
所以要以第三行來進行數字大小排序,然后選出最大的那一行,在根據分隔符選出自己想要的那幾列
[root@localhost ~]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin ............................... ==>文件太長,就不全部顯示了,用省略號代替 basher:x:4330:4335::/home/basher:/bin/bash nologin:x:4331:4336::/home/nologin:/bin/nologin wang:x:4332:4337::/home/wang:/bin/bash systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin [root@localhost ~]# cat /etc/passwd|sort -t: -k3 -n ==>以“:”為分隔符,取第三列進行數字大小排序 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin ................. ==>文件太長,就不全部顯示了,用省略號代替 tom:x:4327:4331::/home/tom:/bin/bash bash:x:4328:4333::/home/bash:/bin/bash testbash:x:4329:4334::/home/testbash:/bin/bash basher:x:4330:4335::/home/basher:/bin/bash nologin:x:4331:4336::/home/nologin:/bin/nologin wang:x:4332:4337::/home/wang:/bin/bash nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin [root@localhost ~]# cat /etc/passwd|sort -t: -k3 -n|tail -n1 ==>取出UID值最大的行 nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin [root@localhost ~]# cat /etc/passwd|sort -t: -k3 -n|tail -n1|cut -d: -f1,3,7 ==>以“:”為分隔符,選出用戶名,UID值,shell類型那幾列,自己數啊 nfsnobody:65534:/sbin/nologin [root@localhost ~]#
4 、查出/tmp 的權限,以數字方式顯示
思路:開始以為是將rwx換成對應的421,要是這么簡單就好了,此題要顯示的結果是777這樣的
stat命令,查看時間戳的命令,此命令可以以數字方式顯示文件的權限,這樣就有方向了
首先一樣的要先取出含有數字權限的行,然后靈活運用分隔符來取出數字權限,具體看下面操作
[root@localhost ~]# stat /tmp File: ‘/tmp’ Size: 4096 Blocks: 8 IO Block: 4096 directory Device: 802h/2050d Inode: 133 Links: 14 Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-07-29 10:26:25.542877847 +0800 Modify: 2016-08-06 10:27:25.572103012 +0800 Change: 2016-08-06 10:27:25.572103012 +0800 Birth: - [root@localhost ~]# stat /tmp|head -n4 ==>顯示前面輸出的前4行,包含有數字權限的那一行 File: ‘/tmp’ Size: 4096 Blocks: 8 IO Block: 4096 directory Device: 802h/2050d Inode: 133 Links: 14 Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root) [root@localhost ~]# stat /tmp|head -n4|tail -n1 ==>顯示包含數字權限的行 Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root) [root@localhost ~]# stat /tmp|head -n4|tail -n1|cut -d"/" -f1 ==>以“/”為分割符,取第一行,結果如下 Access: (1777 [root@localhost ~]# stat /tmp|head -n4|tail -n1|cut -d"/" -f1|cut -d"(" -f2 ==>以“(”為分隔符,取第二行,結果如下 1777
因為stat命令顯示內容格式一樣,所以以上命令適用于任何文件,通用型
當然方法不是唯一的,肯定還有別的方法表示,
5 、統計當前連接本機的每個遠程主機IP 的連接數,并按從大到小排序
思路:netstat -nt是查看遠程主機ip的,因為遠程主機ip不是固定數量的,這里會提前用到grep篩選,grep后面也有,
和前面幾題差不多,建立標準分隔符,然后選出想要的列即可,然后排序,然后顯示重復的行出現的次數,
再排序,結果就出現了,如下
[root@localhost ~]# netstat -nt Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 172.18.18.51:22 172.18.18.206:52175 ESTABLISHED tcp 0 192 172.18.18.51:22 172.18.18.206:58442 ESTABLISHED tcp 0 0 172.18.18.51:22 172.18.18.65:41764 ESTABLISHED tcp 0 0 172.18.18.51:22 172.18.18.65:41765 ESTABLISHED tcp 0 0 172.18.18.51:22 172.18.18.206:52181 ESTABLISHED [root@localhost ~]# netstat -nt|grep tcp ==>顯示遠程主機ip的信息 tcp 0 0 172.18.18.51:22 172.18.18.206:52175 ESTABLISHED tcp 0 64 172.18.18.51:22 172.18.18.206:58442 ESTABLISHED tcp 0 0 172.18.18.51:22 172.18.18.65:41764 ESTABLISHED tcp 0 0 172.18.18.51:22 172.18.18.65:41765 ESTABLISHED tcp 0 0 172.18.18.51:22 172.18.18.206:52181 ESTABLISHED [root@localhost ~]# netstat -nt|grep tcp|tr " " ":" ==>建立標準分隔符,將默認分隔符“ ”改為容易識別的":" tcp::::::::0::::::0:172.18.18.51:22:::::::::::::172.18.18.206:52175:::::::::ESTABLISHED: tcp::::::::0:::::64:172.18.18.51:22:::::::::::::172.18.18.206:58442:::::::::ESTABLISHED: tcp::::::::0::::::0:172.18.18.51:22:::::::::::::172.18.18.65:41764::::::::::ESTABLISHED: tcp::::::::0::::::0:172.18.18.51:22:::::::::::::172.18.18.65:41765::::::::::ESTABLISHED: tcp::::::::0::::::0:172.18.18.51:22:::::::::::::172.18.18.206:52181:::::::::ESTABLISHED: [root@localhost ~]# netstat -nt|grep tcp|tr " " ":"|tr -s ":" ==>進一步簡化,刪除所有重復的字符以單獨一個字符表示,使之更容易識別 tcp:0:0:172.18.18.51:22:172.18.18.206:52175:ESTABLISHED: tcp:0:64:172.18.18.51:22:172.18.18.206:58442:ESTABLISHED: tcp:0:0:172.18.18.51:22:172.18.18.65:41764:ESTABLISHED: tcp:0:0:172.18.18.51:22:172.18.18.65:41765:ESTABLISHED: tcp:0:0:172.18.18.51:22:172.18.18.206:52181:ESTABLISHED: [root@localhost ~]# netstat -nt|grep tcp|tr " " ":"|tr -s ":"|cut -d: -f6 ==>以“:”為分隔符,選擇遠程主機ip的列 172.18.18.206 172.18.18.206 172.18.18.65 172.18.18.65 172.18.18.206 [root@localhost ~]# netstat -nt|grep tcp|tr " " ":"|tr -s ":"|cut -d: -f6|sort ==>排序,將相同的行整理到一起(這一步很重要) 172.18.18.206 172.18.18.206 172.18.18.206 172.18.18.65 172.18.18.65 [root@localhost ~]# netstat -nt|grep tcp|tr " " ":"|tr -s ":"|cut -d: -f6|sort |uniq -c ==>顯示重復行出現的次數 3 172.18.18.206 2 172.18.18.65 [root@localhost ~]# netstat -nt|grep tcp|tr " " ":"|tr -s ":"|cut -d: -f6|sort |uniq -c|sort -rn ==>按數字從大到小排序 3 172.18.18.206 2 172.18.18.65
上面有個sort指令特別提示很重要,那我們來看看如果沒有這一步會如何
[root@localhost ~]# netstat -nt|grep tcp|tr " " ":"|tr -s ":"|cut -d: -f6|uniq -c|sort -rn 2 172.18.18.65 2 172.18.18.206 1 172.18.18.206
顯示的結果完全不同,這是因為uniq指令定義重復行是連續且完全相同的行,
所以盡管第二行和第三行是完全的行,但是因為不是連續的,uniq并沒有把它們顯示為重復行,
而是分開顯示了,用實例來說明吧
[root@localhost ~]# cat a aaaaaa bbbbbb aaaaaa aaaaaa aaaaaa [root@localhost ~]# cat a|uniq -c ==>a文件的第一行沒有顯示為重復行,只有最下面連續的三行顯示為重復行 1 aaaaaa 1 bbbbbb 3 aaaaaa [root@localhost ~]# cat a|sort ==>把a文件排序后,所以的aaaaa都連續顯示了 aaaaaa aaaaaa aaaaaa aaaaaa bbbbbb [root@localhost ~]# cat a|sort|uniq -c ==>再看,重復行變為四行了 4 aaaaaa 1 bbbbbb
正則表達式練習:
1 、顯示/proc/meminfo 文件中以大小s 開頭的行;( 要求:使用兩種方式)
思路:要求開頭是大小寫s的,所以要錨定行首,開始是s即可,后面是什么無所謂,就是指任意字符
指令如下:
grep -i "^s.*" /proc/meminfo grep "^[sS].*" /proc/meminfo [root@localhost ~]# grep -e "^s.*" -e "^S.*" /proc/meminfo
? 2 、顯示/etc/passwd 文件中不以/bin/bash 結尾的行
思路:我們找出一/bin/bash結尾的行然后取反就可以了 ,因為是結尾,所以要錨定行尾如下:
[root@localhost ~]# grep "/bin/bash$" /etc/passwd ==>以/bin/bash結尾的行 [root@localhost ~]# grep -v "/bin/bash$" /etc/passwd ==>使用-v選項取反,內容太多,就不全部顯示了 bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin .......
? 3 、顯示用戶rpc 默認的shell 程序
思路:用戶rpc,所以錨定單詞,然后以分隔符取出shell所在的列
[root@localhost ~]# grep "\<rpc\>" /etc/passwd ==>匹配用戶rpc所在的行 rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin [root@localhost ~]# grep "\<rpc\>" /etc/passwd|cut -d: -f7 ==>以“:”為分隔符,取出sheel所在的列 /sbin/nologin [root@localhost ~]#
? 4 、找出/etc/passwd 中的兩位或三位數
思路:兩位或三位數,所以是錨定單詞,數字出現兩次到三次
指令:
grep "\<[0-9]\{2,3\}\>" /etc/passwd
5 、顯示/etc/grub2.cfg 文件中,至少以一個空白字符開頭的且后面存非空白字符的行
以空白字符開頭,即要使用行首錨定,至少一個,后面存在非空白字符,如下:
cat /etc/grub2.cfg |grep "^[[:space:]]\+[^[:space:]]"
? 6 、找出"netstat -tan" 命令的結果中以'LISTEN' 后跟0 、1或多個空白字符結尾的行
思路:看到結尾就要行尾錨定,LISTEN后面跟任意個空白字符
指令:
netstat -tan|grep "LISTEN[[:space:]]*$"
? 7 、添加用戶bash 、testbash 、basher 以及nologin( 其shell為 為
/sbin/nologin), 而后找出/etc/passwd 文件中用戶名同shell名 名
的行
思路:用戶和shell同名,所以要錨地單詞,且要錨定行首,因為同名,所以要用到后向引用,
shell在最后,所以引用的時候要錨定行尾
指令:
cat /etc/passwd |grep "^\<\(.*\)\>.*\1$"
以上指令可以理解為:前面括號里面出現在行首的任意單詞,都要在行尾出現一次,\就是后向引用,
引用前面出現的單詞,而兩個相同單詞中間可以出現任意字符(即是指的后面一個.*)
行首單詞a(^\<\(.*\)\>) 任意字符(.*) 行尾單詞a(\1$)
擴展正則表達式練習
1 、顯示當前系統root 、mage 或wang 用戶的UID 和默認shell
(root|mage|wang)表示或關系,因為是特指用戶所有行首錨定,詞尾錨定
指令:
egrep "^(root|mage|wang)\>" /etc/passwd
2 、找出/etc/rc.d/init.d/functions 文件中行首為某單詞(包括下劃線) 后面跟一個小括號的行
思路:行首錨定,單詞錨定,單詞中包含數字字母下劃線至少出現一次,后面括號,
注意:擴展正則表達式和基本正則表達式元字符使用時要差異,最明顯的是轉義符,謹記?。。。。。。?/strong>
3 、使用egrep 取出/etc/rc.d/init.d/functions 中其基名
說明:基名即使functions
思路:基名肯定是在行尾,所有錨定行尾,且不能有“/”
指令:
echo /etc/rc.d/init.d/functions|egrep -o "[^/]+$"
4 、使用egrep 取出上面路徑的目錄名
本來想做上面也一題的,莫名其妙把這題搞出來了,也是醉了
指令:
echo /etc/rc.d/init.d/functions|egrep -o "/.*/"
? 5 、統計以root 身份登錄的每個遠程主機IP 地址的登錄次數
指令:
last |egrep "root"|egrep -o "(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"|sort|uniq -c|sort -n
6 、利用擴展正則表達式分別表示0-9 、10-99 、100-199、 200-249 、250-255
說明:上面一題已經顯示過了
egrep -o "(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"
? 7 、顯示ifconfig 命令結果中所有IPv4
說明: 第五題方法也可解決此問題
ifconfig |egrep -o "(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"
課后習題
1、統計/etc/init.d/functions 文件中每個單詞出現的次數,并按頻率從高到低顯示
cat /etc/init.d/functions |grep -o "\<[[:alnum:]]*\>"|sort|uniq -c|sort -n
2、正則表達式表示身份證號
驗證我的身份證號碼成功了,但是感覺有問題
echo 420117198912073577 | egrep "(^[1-9][0-9]{16}[[:digit:]xX]$)|^([1-9][0-9]{14})$" echo 420117198912073577 | egrep "(\<[1-9][0-9]{16}[[:digit:]xX]\>)|\<([1-9][0-9]{14})\>"
3、正則表達式表示手機號
手機號碼11位,開頭固定為1,第二位我知道的是3,5,8,要是不對可以再換,后面9位數字
echo 18922718172|egrep "^1[358][0-9]{9}$"
4、正則表達式表示郵箱
我不太了解郵箱的必要條件,所以可能有漏掉一些字符,,以下我自己的郵箱是符合的…..
echo 0811_7...64@126.com |egrep "[[:alnum:]_.]+@[[:alnum:]_.]+\.com"
5、正則表達式表示QQ號
echo 381147864|egrep "\<[1-9][0-9]{4,}"
以上這些題目希望老師能最好在能夠在上課的時候稍微講一下 !!
原創文章,作者:qiuwei,如若轉載,請注明出處:http://www.www58058.com/29972