一、顯示當前系統上root、fedora或user1用戶的默認shell;linux
#grep: -E:使用擴展正則表達式,即egrep,^:行首匹配,|:或者 #cut: -d:指定分隔符,-f:取第幾列 [root@localhost shell]# grep -E "^root|fedora|user1" /etc/passwd | cut -d: -f1,7 root:/bin/bash
二、找出/etc/rc.d/init.d/functions文件中某單詞後面跟一組小括號的行,形如:hello();正則表達式
#grep:[:alpha:] :字母 ,?:匹配次數,0次或1次 #\<:詞首匹配,\>:詞尾匹配,你也能夠用\b替代,既能夠匹配詞首也能夠匹配詞尾 [root@localhost shell]# grep "\<[[:alpha:]]\+_\?[[:alpha:]]\+\>()" /etc/rc.d/init.d/functions checkpid() { daemon() { killproc() { pidfileofproc() { pidofproc() { status() { echo_success() {
三、使用echo命令輸出一個絕對路徑,使用grep取出其基名;shell
#文件名 #直接用basename看輸出結果,是最後一個/後面的內容,固然若是後面有/應當去除 [root@localhost test]# basename /etc/init.d/httpd/ httpd #grep -o "\<[^/]\+/\?$" :獲取最後的/後面的非空字符 #cut -d'/' -f1:以/爲分隔符獲取第一段字節內容 [root@localhost shell]# echo "/etc/init.d/httpd/" | grep -o "\<[^/]\+/\?$" | cut -d'/' -f1 httpd
擴展:取出其路徑名vim
#路徑名,直接用dirname命令查看效果 [root@localhost test]# dirname /etc/init.d/httpd/ /etc/init.d #grep -o "^/.*[^/]\+":去除最後一個無用的/ #awk -F '/[^/]*$' '{print $1}':查找路徑 [root@localhost test]# echo /etc/init.d/httpd/ | grep -o "^/.*[^/]\+" | awk -F '/[^/]*$' '{print $1}' /etc/init.d
四、找出ifconfig命令結果中的1-255之間數字;數組
1.用grep拼接字符串bash
[root@localhost test]# ifconfig | egrep -o "\<[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]\>" 0 0 29 92 192 168 108 130
2.數值比較app
#!/bin/bash #先找出1~3位長度的數字,而後進行排序,去重 nums=$(ifconfig | grep -o "\<[0-9]\{1,3\}\>" | sort -n -u) #進入for循壞,一個個數字進行比較是否1<=num<=255,若是知足條件則輸出 for num in $nums do if [ $num -ge 1 -a $num -le 255 ];then echo $num fi done #運行結果 [root@localhost shell]# ./test4.sh 1 2 4 8 10 29 64 80 111 127 128 168 192 255
五、挑戰題:寫一個模式,能匹配合理的IP地址;ide
我理解的合理的ip地址可能不太準確,1.0.0.0~255.255.255.254oop
1.grep拼接字符串測試
#測試文件裏放入一些測試數據 [root@localhost shell]# cat test.txt 0.0.1.2 #超出範圍 198.98.2.1 255.255.255.254 172.168.1.2 257.1.1.1 #大小超出範圍 2555.1.1.1 #長度超出範圍 233.1.2 #字節個數少一個 172.168.1.2.1 #字節個數多一個 255.255.255.255 #須要剔除的數據 #由於模式比較長,咱們先看第一個字節 #把ip分爲一位長度,兩位長度,三位長度 #1位長度:1-9,匹配就是 [1-9] #2位長度:10~99,十位數是[1-9],個位數是[0-9] #3位長度:分紅100~199:1[0-9][0-9],200~249:2[0-4][0-9],250~255:25[0-5] #而後用|拼接,就是1~255,其餘三個字節也照這個規則寫好正則表達是,不一樣字節用.鏈接,但注意要轉義,否則覺得是匹配任意單個字符 #最後 grep -v 去除255.255.255.255 [root@localhost shell]# egrep "^([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])\.([0-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])$" test.txt | grep -v "255.255.255.255" 198.98.2.1 255.255.255.254 172.168.1.2 #稍微整理一下,二三四其實匹配模式是同樣的,(.***)匹配三次便可 [root@localhost shell]# egrep "([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]){3})" test.txt | grep -v "255.255.255.255" 255.255.255.254 172.168.1.2 172.168.1.2.1
2.數值比較
[root@localhost test]# cat sixth.sh #/bin/bash ip=$1 #進入for循環,以.爲分隔符截取各字節內容,放入屬組中 for((i=1;i<=4;i++)) do array[$i]=$(echo $ip | cut -d "." -f$i) echo ${array[$i]} done #數組每一個字節比較是否在範圍內 if [ ${array[1]} -ge 1 ] && [ ${array[1]} -le 255 ];then if [ ${array[2]} -ge 0 ] && [ ${array[2]} -le 255 ];then if [ ${array[3]} -ge 0 ] && [ ${array[3]} -le 255 ];then if [ ${array[4]} -ge 0 ] && [ ${array[4]} -le 255 ];then echo $ip fi fi fi fi #運行結果 [root@localhost test]# ./sixth.sh 192.168.1.2 192 168 1 2 192.168.1.2
六、挑戰題:寫一個模式,能匹配出全部的郵件地址;
郵箱地址規則
1)郵箱完整地址由用戶名@域名組成
2)用戶名最少三個字符,由由字母、數字、下劃線組成,字母不區分大小寫
3)域名應至少有一個 . 分隔,分隔的各部分至少2個字符,可能由字母、數字組成
#測試文件 [root@localhost shell]# cat mail.txt 123@qq.com abc123@163.com a_12@souhu.com#有下劃線,結果應該出現 vtw@ch.edu.com #有兩個 . ,結果應該出現 abcde #沒有@ abc@123#沒有.分隔符 #[:alnum:]:字母或數字,[[:alnum:]_]:字母或數字或下劃線 ,{3,}:至少三次 #\.:至少出現一個.分隔符 #[[:alnum:]]:字母或數字,{2,}至少兩個字符 #\.[[:alnum:]]{2,}:.數字或字符出現至少一次 [root@localhost shell]# egrep "[[:alnum:]_]{3,}@[[:alnum:]]{2,}(\.[[:alnum:]]{2,}){1,}$" mail.txt 123@qq.com abc123@163.com a_12@souhu.com vtw@ch.edu.com
七、查找/var目錄下屬主爲root,且屬組爲mail的全部文件或目錄;
#find: -user:匹配屬主,-group:匹配屬組 [root@localhost shell]# find /var -user root -group mail /var/spool/mail /var/spool/mail/root
八、查找當前系統上沒有屬主或屬組的文件;
#find:-nouser:沒有屬主,-nogroup:沒有屬組, #特別要注意這裏的或者,著名的摩根定律,非(P 且 Q) = (非 P) 或 (非 Q),非(P 或 Q) = (非 P) 且 (非 Q) #輸出結果時,由於find一次性把查找到的結果直接傳遞到後面命令可能會致使執行錯誤,用xargs避免該錯誤 [root@localhost shell]# find / -nouser -a -nogroup | xargs ls -lrt /root/rpm/READMEs/cs_CZ: total 4 -r--r--r--. 1 226 12201 3874 Mar 8 2013 readme /root/rpm/READMEs: total 64 drwxr-xr-x. 2 226 12201 4096 Mar 8 2013 zh_TW.BIG5 drwxr-xr-x. 2 226 12201 4096 Mar 8 2013 zh_TW drwxr-xr-x. 2 226 12201 4096 Mar 8 2013 zh_CN
進一步:查找當前系統上沒有屬主或屬組,且最近3天內曾被訪問過的文件或目錄;
#-atime :訪問時間,n表示[n,n+1),-n:[0,n),+n:[n+1,∞) [root@localhost ~]# find / -nouser -a -nogroup -a -atime -3 find: `/proc/5084/task/5084/fd/5': No such file or directory find: `/proc/5084/task/5084/fdinfo/5': No such file or directory find: `/proc/5084/fd/5': No such file or directory find: `/proc/5084/fdinfo/5': No such file or directory /root/rpm/licenses /root/rpm/READMEs /root/rpm/READMEs/fr_FR
九、查找/etc目錄下全部用戶都有寫權限的文件;
#-perm :權限匹配,MODE:精確匹配,-MODE:每類對象都必須有指定權限,/MODE:任何一類對象有符合指定權限的便可 #這裏是全部用戶都必須有寫權限,寫權限轉換成8進制是2,其餘權限位無須考慮 [root@localhost ~]# find /etc -perm -222 | xargs ls -lrt lrwxrwxrwx. 1 root root 27 Jul 17 2015 /etc/X11/fontpath.d/liberation-fonts -> /usr/share/fonts/liberation lrwxrwxrwx. 1 root root 11 Jul 17 2015 /etc/init.d -> rc.d/init.d lrwxrwxrwx. 1 root root 20 Jul 17 2015 /etc/rc.d/rc6.d/K85messagebus -> ../init.d/messagebus lrwxrwxrwx. 1 root root 20 Jul 17 2015 /etc/rc.d/rc5.d/S22messagebus -> ../init.d/messagebus lrwxrwxrwx. 1 root root 20 Jul 17 2015 /etc/rc.d/rc4.d/S22messagebus -> ../init.d/messagebus
十、查找/etc目錄下大於1M,且類型爲普通文件的全部文件;
#-type:按類型匹配 f:普通文件 d:目錄文件,s:套接字文件,l:軟鏈接文件,p:管道文件,b:塊設備文件,c:字符設備文件 #-size:按文件大小匹配,單位能夠是K,M,G ,n表示[n,n+1),-n:[0,n),+n:[n+1,∞) [root@localhost ~]# find /etc -type f -size +1M -ls 134648 1976 -rw-r--r-- 1 root root 2020885 Jul 17 2015 /etc/gconf/gconf.xml.defaults/%gconf-tree.xml 140412 7124 -rw-r--r-- 1 root root 7292701 Jul 17 2015 /etc/selinux/targeted/modules/active/policy.kern 140687 7124 -rw-r--r-- 1 root root 7292701 Jul 17 2015 /etc/selinux/targeted/policy/policy.24
十一、查找/etc/init.d/目錄下,全部用戶都有執行權限,且其它用戶有寫權限的文件;
#perm:按權限匹配 #都有執行權限是111,其餘用戶有寫權限2,其餘用戶的權限就是1+2=3,因此組合的權限就是113 [root@localhost ~]# find /etc/init.d -perm -113 -ls 130387 0 lrwxrwxrwx 1 root root 11 Jul 17 2015 /etc/init.d -> rc.d/init.d
十二、查找/usr目錄下不屬於root、bin或hadoop的文件;
#注意()加轉義符 [root@localhost ~]# find /usr -not \( -user root -a -user bin -a -user hadoop \) -ls 657606 84 -rwxr-xr-x 1 root root 82192 Nov 25 2013 /usr/libexec/wnck-applet 665926 44 -rwxr-xr-x 1 root root 41312 Nov 25 2013 /usr/libexec/gnome-clock-applet-mechanism 656684 92 -rwxr-xr-x 1 root root 90352 Aug 22 2010 /usr/libexec/obex-client 658381 24 -rwxr-xr-x 1 root root 23864 Nov 11 2010 /usr/libexec/geoclue-localnet 677225 48 -rwxr-xr-x 1 root root 46480 Nov 11 2010 /usr/libexec/gdu-notification-daemon
1三、查找/etc/目錄下至少有一類用戶沒有寫權限的文件;
#-perm -222:每一類用戶都有寫權限 #-not -perm -222:至少一類用戶沒有寫權限 [root@localhost test]# find /etc -not -perm -222 -ls 785634 20 -rwxr-xr-x 1 root root 19688 Nov 22 2013 /etc/rc.d/rc.sysinit 782928 4 drwxr-xr-x 2 root root 4096 Aug 24 12:12 /etc/rc.d/rc1.d 915527 4 drwxr-xr-x 2 root root 4096 Aug 24 12:12 /etc/rc.d/rc3.d 915533 4 drwxr-xr-x 2 root root 4096 Aug 24 12:12 /etc/rc.d/rc4.d 783245 4 -rw-r--r-- 1 root root 1962 Feb 17 2012 /etc/vimrc 783239 4 -rw-r--r-- 1 root root 2620 Aug 16 2010 /etc/mtools.conf
1四、查找/etc目錄下最近一週內其內容被修改過,且不屬於root或hadoop的文件;
[root@localhost test]# find /etc -mtime -7 -a -not -user root -a -not -user hadoop 或者: [root@localhost test]# find /etc -mtime -7 -a -not \( -user root -o -user hadoop \)
若有錯誤之處,煩請看官評論裏指點一下,小女子不勝感激。