一、作業(練習)內容:
1、總結本此課程中所涉及命令的使用方法及相關示例展示
2、總結基本正則表達式及擴展正則表達式
3、顯示/etc/passwd文件中以bash結尾的行
4、顯示/etc/passwd文件中的兩位數或三位數
5、顯示`netstat -tan`命令結果中以‘LISTEN’後跟0個、1個或者多個空白字符結尾的行
6、添加用戶bash、testbash、basher以及nologin用戶(nologin用戶的shell爲/sbin/nologin);而後找出/etc/passwd文件中用戶名與其shell名相同的行
7、顯示當前系統上root、centos或者user1用戶的默認shell和UID (請事先創建這些用戶,若不存在)
8、找出/etc/rc.d/init.d/functions文件中某單詞(單詞中間可以存在下劃線)後面跟着一組小括號的行
9、使用echo輸出一個路徑,而後egrep找出其路徑基名;進一步的使用egrep取出其目錄名
10、找出ifconfig命令執行結果中1-255之間的數字
第一、二題:
http://huangyisan.blog.51cto.com/6925110/1690105
http://huangyisan.blog.51cto.com/6925110/1690110
第三題:使用$錨定bash爲詞尾
[root@ST_server home]# grep "bash$" /etc/passwd root:x:0:0:root:/root:/bin/bash nginx:x:498:498::/home/nginx:/bin/bash mysql:x:500:500::/home/mysql:/bin/bash huangyisan:x:502:502::/home/huangyisan:/bin/bash huangyisan1:x:503:503::/home/huangyisan1:/bin/bash huangyisan2:x:504:502::/home/huangyisan2:/bin/bash huangyisan3:x:505:505::/home/huangyisan3:/bin/bash
第四題:第一位設定爲[1,9]然後第二位和第三位爲[0,9],並且讓他們出現一次(因爲已經有了最高位了)所以第二位其實是出現1次或者2次,然後用-o將需要匹配的對象給摳出來。
[root@ST_server home]# grep -o "\<[1-9][0-9]\{1,2\}\>" /etc/passwd_bak
最後顯示的結果沒有把"07"給匹配進去,因爲07屬於一位數。這道題目要注意的是首位數字不能爲0
[root@ST_server home]# cat /etc/passwd_bak | grep 07 halt:x:07:0:halt:/sbin:/sbin/halt [root@ST_server home]# grep -o "\<[1-9][0-9]\{1,2\}\>" /etc/passwd_bak | grep 07 [root@ST_server home]#
第五題:0,1個或者多個,那麼是前一個字符的多次匹配,可以使用*,或者使用{0,\},然後他要求是空白字符結尾的行,空白字符可以用[:space:]表示,結尾的行則使用行尾錨定$
[root@ST_server home]# cat aa.txt Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 192.168.91.130:4506 192.168.91.131:54854 ESTABLISHED tcp 0 0 :::8080 :::* LISTEN tcp 0 0 ::1:53 :::* LISTEN tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTENING1 tcp 0 0 :::8009 :::* LISTENING
編輯了一個aa.txt寫了個干擾項。
[root@ST_server home]# cat aa.txt | egrep "LISTEN[[:space:]]{0,}$" tcp 0 0 :::8080 :::* LISTEN tcp 0 0 ::1:53 :::* LISTEN [root@ST_server home]# cat aa.txt | egrep "LISTEN[[:space:]]*$" tcp 0 0 :::8080 :::* LISTEN tcp 0 0 ::1:53 :::* LISTEN
最終抓出了LISTEN的項目,其實這個LISTEN後面還有空格符的。
第六題:passwd分佈第一部分是用戶名,用^來錨定,最後一個部分是shell模式,用$來錨定,他說要用戶名和shell模式相同,先把用戶名給抓出來,用\<用戶名\>,然後使用\1來匹配,把用戶名參數傳入到\1中。
[root@ST_server home]# grep -E "^(\<[[:alnum:]]+)\>.+\1$" /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt bash:x:606:606::/home/bash:/bin/bash nologin:x:609:609::/home/nologin:/sbin/nologin
[[:alnum:]]包含了字母和數字。
第七題:三個用戶採用或關係,首先想"|"符號,通過passwd提取,第一部分爲用戶名,首行錨定這三個用戶。
[root@ST_server home]# grep -E "^(\<root\>|\<centos\>|\<user1\>)" /etc/passwd root:x:0:0:root:/root:/bin/bash centos:x:611:611::/home/centos:/bin/bash user1:x:612:612::/home/user1:/bin/bash
第八題:我的寫法存在問題。無法對相隔多個單詞之間的下劃線進行匹配,這樣雖然可以匹配出來,但是並沒用上語句的邏輯。
grep -E "\<[[:alpha:]]+_?[[:alpha:]].*\(\)" /etc/rc.d/init.d/functions
第九題:可能echo出現的路徑最後會存在/,我的手法是提取兩次。先把基名/提取出來,然後再一次提取基名。關鍵點是[^/]弄出去掉/的部分。[^/]得到的是一個個的字母,[^/]+得到的纔是一個完整的字符串。這點需要注意!
[root@ST_server init.d]# echo "/etc/sysconfig/networks-sysconfig/" | egrep -o "^(/[^/]+){1,}" | egrep -o "[^/]+$" networks-sysconfig
提取基名的目錄名:
[root@ST_server ~]# echo "/etc/sysconfig/networks-sysconfig/cis00co/h3c_009/update/mv/" | egrep -o "^(/[^/]+){1,}" | egrep -o "^/([^/]+/){1,}" | egrep -o "[^/]+/?$" | egrep -o "[^/]+" update
第十題:分成五個段,個位段;十位段,100-199段,200-249段,250-255段
[root@ST_server home]# ifconfig | egrep "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
還有點問題,比如mac地址內的數字沒有被抓取出來。
擴展:抓取ifconfig的ip地址。特點是第一個不能爲0 範圍是1-255 第二個到第四個可以爲0,範圍是0-255。
[root@ST_server home]# ifconfig |egrep -o "(\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.)(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){2}(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>)" 192.168.130.131 192.168.130.255 255.255.255.0 127.0.0.1 255.0.0.0