一、顯示當前系統上root、fedora或user1用戶的默認shell;
node
答:須要找到3個字符串,須要用到「或」命令,因此使用egrep。找到後cut再次篩選出咱們須要顯示的用戶默認的shell。shell
命令爲:egrep "^(root|fedora|user1)" /etc/passwd | cut -d: -f1,7bash
結果以下:服務器
二、找出/etc/rc.d/init.d/functions文件中某單詞後面跟一組小括號的行,形如:hello();ide
三、使用echo命令輸出一個絕對路徑,使用grep取出其基名;測試
答:首先咱們要了解什麼是路徑的基名和路徑名:spa
基名:能夠理解爲路徑名最右邊的名稱;debug
路徑名:除基名之外的路徑;3d
瞭解以後咱們使用grep取出一個路徑的基名
注:"\<[^/]\+" 意思爲匹配非"/"開頭的單詞,"\<"爲詞首錨定,"\+"爲匹配前面的條件至少一次;
"/\?$" 意思爲匹配行尾"/"符號無關緊要的行,"\?"匹配前面的字符0或1次,"$"行尾錨定。
條件"\<[^/]\+/\?$" 即匹配非"/"開頭的單詞而且行尾的"/"無關緊要
命令擴展:
grep的條件中使用了不少"\"來轉義,爲了方便簡潔,還可使用egrep來完成,以下圖;
此外,咱們還可使用basename命令直接獲取一個路徑的基名,以下圖;
也可使用dirname命令直接獲取一個路徑的路徑名,以下圖;
擴展:取出其路徑名
四、找出ifconfig命令結果中的1-255之間數字;
答:此匹配模式僅僅只是找出1-255之間的數字,不考慮IP等因素‘
五、挑戰題:寫一個模式,能匹配合理的IP地址;
答:可編寫一個腳原本實現,思路是先判斷每一個數字是否小於255,要合理且可用必須小於255;而後經過行首行尾錨定來肯定給出的IP地址位數,大於或小於4位判斷爲非可用IP。腳本以下:
測試結果以下:
[root@csd ~]# alias testip="./testip.sh" ##定義腳本別名,要永久定義請修改配置文件 [root@csd ~]# testip 254.254.254 ##給出的IP地址只有3個,不符合可用IP要求 The ip is not reasonable [root@csd ~]# testip 2.111.111.111 ##正確可以使用IP The ip is reasonable [root@csd ~]# testip 199.250.3.1 The ip is reasonable [root@csd ~]# testip 255.3.2.1 ##有一個不小於255,不可用 The ip is not reasonable [root@csd ~]# testip 14.0.0.1 The ip is reasonable [root@csd ~]# testip 14.0.0.0 ##此IP理論上可用,可是若要配置給服務器使用 The ip is not reasonable 是不行的,故不放在考慮範圍 [root@csd ~]# testip 14.0.0.1.2 ##大於4個,不可用 The ip is not reasonable
六、挑戰題:寫一個模式,能匹配出全部的郵件地址;
答:可編寫一個腳原本實現;思路爲匹配任意字母或數字開頭且有@符號,後跟任意字母或數字且以.com或.cn結尾的字符串。
測試結果以下
[root@csd ~]# alias testm="./testmail.sh" ##定義腳本別名,要永久定義請修改配置文件 [root@csd ~]# testm 1111@163.com.cn This is a email address [root@csd ~]# testm chenshunde@qq.com This is a email address [root@csd ~]# testm chenshunde@jlkjsdf.com This is a email address [root@csd ~]# testm 2322w177@163.com This is a email address [root@csd ~]# testm lkjsdfkljs This is not a email address [root@csd ~]# testm lkjsdfkljs@.com This is not a email address [root@csd ~]# testm 2322w177@163.cn This is a email address
七、查找/var目錄下屬主爲root,且屬組爲mail的全部文件或目錄;
答:
注:-user root:查找指定屬主爲root的文件或目錄;
-group mail:查找指定屬組爲mail的文件或目錄;
-ls:至關與ls -l
八、查找當前系統上沒有屬主或屬組的文件;
答:find命令中查找沒有屬主的選項爲"-nouser";查找沒有屬組的選項爲"-nogroup"
進一步:查找當前系統上沒有屬主或屬組,且最近3天內曾被訪問過的文件或目錄;
爲了便於演示,咱們先建立2個文件文件,修改其屬主和屬組以及訪問時間:
[root@csd test]# touch testatime1.txt ##建立文件1 [root@csd test]# touch testatime2.txt ##建立文件2 [root@csd test]# touch -a -t 201609011342.34 testatime1.txt ##修改文件1訪問時間 [root@csd test]# touch -a -t 201609021521.54 testatime2.txt ##修改文件2訪問時間 [root@csd test]# chown 1001:1001 /test/testatime1.txt ##修改文件1屬主和屬組爲無 [root@csd test]# chown 1001:1001 /test/testatime2.txt ##修改文件2屬主和屬組爲無 ##說明:所謂無屬組和無屬主,就是在/etc/passwd文件中無有效的UID和GID,這次試驗中個人/etc/passwd文件 沒有UID號爲1001的用戶和GID號爲1001的組,因此斷定爲無屬主或無屬組。 [root@csd test]# stat testatime1.txt ##查看文件1的狀態 File: "testatime1.txt" Size: 0 Blocks: 0 IO Block: 4096 普通空文件 Device: 802h/2050d Inode: 395343 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-09-01 13:42:34.000000000 +0800 ##此爲訪問時間 Modify: 2016-09-03 01:58:41.270874816 +0800 ##此爲修改時間 Change: 2016-09-03 01:59:09.409420634 +0800 [root@csd test]# stat testatime2.txt ##查看文件2的狀態 File: "testatime2.txt" Size: 0 Blocks: 0 IO Block: 4096 普通空文件 Device: 802h/2050d Inode: 395769 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-09-02 15:21:54.000000000 +0800 Modify: 2016-09-03 01:58:44.166927110 +0800 Change: 2016-09-03 01:59:28.165787554 +0800 [root@csd test]# find / \( -nouser -o -nogroup \) -atime -3 -ls ##find可以使用組合條件 "-o"表示爲條件或, "-a"指明訪問時間, "-ls"同等於"ls -l" 使用條件組合時必須使用 括號且括號需轉義
結果圖以下:
九、查找/etc目錄下全部用戶都有寫權限的文件;
答:find命令能夠根據權限來查找,使用選項爲"-perm"。
[root@csd test]# find /etc -perm -222 -ls;
效果以下
"-222"匹配的權限爲屬主擁有寫權限,屬組擁有寫權限,其餘用戶擁有寫權限;
說明:find使用權限查找時有三種用法;
①find /etc -perm /MODE;此用法表示任何一類(u,g,o)對象權限中的只要能一位匹配便可;
②find /etc -perm -MODE;此用法表示每一類對象都必須同時擁有爲其指定的權限標準;
③find /etc -perm MODE;此用法表示精確權限匹配;
十、查找/etc目錄下大於1M,且類型爲普通文件的全部文件;
答:find命令可根據文件大小來查找,使用選項"-size"
說明:
-size [+|-]#UNIT
經常使用單位:k,M,G
#UNIT:不加+-號,大於#-1,小於或等於#
-#UNIT:大於0,小於或等於#-1
+#NUIT:大於#
效果以下:
十一、查找/etc/init.d/目錄下,全部用戶都有執行權限,且其它用戶有寫權限的文件;
答:
十二、查找/usr目錄下不屬於root、bin或hadoop的文件;
答:爲了便於演示,咱們首先建立兩個test文件,並修改屬主;
[root@csd usr]# touch test1.txt ##建立文件 [root@csd usr]# touch test2.txt [root@csd usr]# chown bash: test1.txt ##修改文件屬主 [root@csd usr]# chown testbash: test2.txt [root@csd ~]# find /usr -not \( -user root -o -user bin -o -user hadoop \) -ls ##find支持條件查詢,"-o"爲或;"-not"爲非。 133800 0 -rw-r--r-- 1 bash bash 0 9月 3 14:18 /usr/test1.txt 133804 0 -rw-r--r-- 1 testbash testbash 0 9月 3 14:18 /usr/test2.txt 137096 12 -rwsr-xr-x 1 abrt abrt 10096 8月 14 2013 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache
結果以下:
1三、查找/etc/目錄下至少有一類用戶沒有寫權限的文件;
答:
[root@csd ~]# find /etc ! -perm -222 -ls 說明:"-222"表示查找全部權限中都有寫權限的文件和目錄,要查找至少有一類用戶沒有寫權限的,咱們進行取反便可; "!"表示非,等同於"-not"
效果以下:
1四、查找/etc目錄下最近一週內其內容被修改過,且不屬於root或hadoop的文件;
答:
[root@csd etc]# touch test.txt ##新建文件 [root@csd etc]# touch test1.txt [root@csd etc]# chown bash: test.txt ##修改文件屬主 [root@csd etc]# chown basher: test1.txt [root@csd etc]# vi test.txt ##編輯文件,知足一週內被修改過的條件 [root@csd etc]# vi test1.txt [root@csd ~]# find /etc \( ! \( -user root -o -user hadoop \) \) -a \( -mtime -7 \) -ls 3781 4 -rw-r--r-- 1 basher basher 16 9月 3 14:46 /etc/test1.txt 3782 4 -rw-r--r-- 1 bash bash 17 9月 3 14:46 /etc/test.txt [root@csd ~]# touch -m -t 201608021423.42 /etc/test1.txt ##修改/etc/text1.txt的modify time [root@csd ~]# stat /etc/test1.txt ##查看/etc/text1.txt文件狀態 File: "/etc/test1.txt" Size: 16 Blocks: 8 IO Block: 4096 普通文件 Device: 802h/2050d Inode: 3781 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 3006/ basher) Gid: ( 3008/ basher) Access: 2016-09-03 14:46:38.969278255 +0800 Modify: 2016-08-02 14:23:42.000000000 +0800 Change: 2016-09-03 14:52:48.479680378 +0800 [root@csd ~]# find /etc \( ! \( -user root -o -user hadoop \) \) -a \( -mtime -7 \) -ls 3782 4 -rw-r--r-- 1 bash bash 17 9月 3 14:46 /etc/test.txt
效果以下:
爲了更好的看出效果,咱們修改下test1的modify time