馬哥運維班第五週做業

一、顯示當前系統上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 \)


若有錯誤之處,煩請看官評論裏指點一下,小女子不勝感激。

相關文章
相關標籤/搜索