本周作业内容:

1、显示当前系统上root、fedora或user1用户的默认shell;

1
2
3
4
5
6
7
     [root@liu home] # grep -E  "^(root|fedora|user1)\>" /etc/passwd |cut -d: -f1,7  
     root: /bin/bash            
     user1: /bin/bash
     fedora: /bin/bash
     #本题使用扩展的正则表达式
     #^:首行 |:或者 ():将一个或者多个字符捆绑在一起当作一个整体来处理 \>:表示词尾定锚定
     #cut -d: f1,7 表示用:号作为分隔符,截取第1字段和第7个字段.分别代表用户名和默认的登陆shell

    
    
2、找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行,形如:hello();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
     [root@liu /] # grep -E -o "[_[:alpha:]]+\(\)" /etc/rc.d/init.d/functions 
     fstab_decode_str()
     checkpid()
     __readlink()
     __fgrep()
     __umount_loop()
     __umount_loopback_loop()
     __pids_var_run()
     __pids_pidof()
     daemon()
     killproc()
     pidfileofproc()
     pidofproc()
     status()
     echo_success()
     echo_failure()
     echo_passed()
     echo_warning()
     update_boot_stage()
     success()
     failure()
     passed()
     warning()
     action()
     strstr()
     confirm()
     get_numeric_dev()
     is_ignored_file()
     is_true()
     is_false()
     apply_sysctl()
     key_is_random()
     find_crypto_mount_point()
     init_crypto()
     #使用grep -E 或者egrep扩展正则表达式,-o 表示只匹配到符合的字符
     #[_[:alpha:]]表示以_或者大小写字母开头的字符;+表示前面的字符出现一次或多次;
     #要匹配包含()的行,在过滤时需要对小括号进行转义:\(\)

3、使用echo命令输出一个绝对路径,使用grep取出其基名;

1
2
3
4
     [root@liu /] # echo "/tmp/ljohn/useradd.sh" | grep -E -o "[^/]+$"
     useradd .sh
     [root@liu ~] # echo "/tmp/ljohn/useradd.sh/" |grep -Eo "[^/]+/?$" |cut -d'/' -f1
     useradd .sh

    #基名basename /tmp/ljohn/useradd.sh

1
2
3
4
     [root@liu ~] # basename /tmp/ljohn/useradd.sh
     useradd .sh
     [root@liu ~] # basename /tmp/ljohn/useradd.sh/
     useradd .sh
1
2
3
      #这样可以看出第二种同basename命令。
     #行尾的字符串[^/]除了/斜线的任意内容,+代表这个/至少出现1次
     #$:表示行尾锚定

    扩展:取出其路径名

1
2
3
4
5
6
7
8
9
     [root@liu /] # echo "/tmp/ljohn/useradd.sh" | grep -E -o "^/.*/"
     /tmp/ljohn/
     [root@liu ~] # echo "/tmp/ljohn/useradd.sh" |grep -Eo "^/.*/" |grep -Eo "^/.*[^/]"
     /tmp/ljohn
     #目录名dirname /tmp/ljohn/useradd.sh
     [root@liu ~] # dirname /tmp/ljohn/useradd.sh
     /tmp/ljohn
     [root@liu ~] # dirname /tmp/ljohn/useradd.sh/
     /tmp/ljohn
1
2
3
4
     #这样可以看出第二种同dirname命令
     #^/.*/ 表示以/开头,中间任意长度字符,以/结尾。
     #.*:任意长度的任意字符
     #[^/]:除了斜线的任意内容

4、找出ifconfig命令结果中的1-255之间数字;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
     [root@liu /] # ifconfig | grep -E -o "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9])\>" | sort 
     -n -u
     5
     8
     19
     20
     29
     30
     31
     38
     39
     41
     42
     45
     64
     100
     127
     128
     137
     150
     164
     168
     192
     255
     #[1-9]表示1-9;[1-9][0-9]表示10-99;1[0-9][0-9]表示100-199;2[0-9][0-9])表示200-299
     #使用-o参数表示只显示匹配到的字符;
     #sort -n -u 按数字大小排序并去重;

5、挑战题:写一个模式,能匹配合理的IP地址;
    # A类地址范围:1.0.0.1—126.255.255.254   B类地址范围:128.0.0.1—191.255.255.254
    # C类地址范围:192.0.0.1—223.255.255.254  D类地址范围:224.0.0.1—239.255.255.254
    # E类地址范围:240.0.0.1—255.255.255.254  127.X.X.X是保留地址,用做循环测试用的
    # 匹配范围为 1-255.0-255.0-255.1-254

1
2
3
[root@liu /] # ifconfig | grep -E -o "(2[0-5]{2}|1[0-9]{2}|[1-9][0-9]|[1-9])\.((2[0-5]{2}|1[0-9]{2}|[1-9][0-9]|[0-9])\.){2}\<(2[0-5][0-4]|1[0-9]{2}|[1-9][0-9]|[1-9])\>"
     192.168.137.30
     127.0.0.1

    #此题参考http://ld0381.blog.51cto.com/3318114/1845601;    http://2368360.blog.51cto.com/2358360/1846091
    #详细解析:
        ^PATTERN$ 用于模式匹配整行
        {2}表示前面字符正好出现两次
        | 的意思是或者
        ( )上面的括号不能少,是为了匹配括号中整体字符串,表达式中有几个()就表示有几个相应的匹配字符串
        [0-4]表示0~4的任何一个数字
        [0-9]表示0~9的任何一个数字
        [1-9]的意思是1~9之间的任意一个数字
        [1-9][0-9]的意思是10~99之间的任意一个数字
        1[0-9]{2}的意思就是100~199之间的任意一个数字
        2[0-4][0-9]的意思是200~249之间的任意一个数字
        25[0-5]的意思是250~255之间的任意一个数字
        \.的意思是.点要转义为普通字符

6、挑战题:写一个模式,能匹配出所有的邮件地址;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
     [root@liu /] # cat /tmp/mail.txt
     184694637@qq.com
     lshailkj@qq.com
     ljohnmail@foxmail.com
     foxmail@_cmd.cn
     ljohn@163.com
     lkjdas_ #@123_.com
     [root@liu /] # grep -E   "^[[:alnum:]]+@[[:alnum:]]+\.[[:alnum:]]+$"  /tmp/mail.txt 
     184694637@qq.com
     lshailkj@qq.com
     ljohnmail@foxmail.com
     ljohn@163.com
     #先创建了一个mail.txt的文件事先编辑了几个邮箱
     #首先要了解邮箱的格式:数字字母@数字字母.数字字母
     #[[:alnum:]]+ 表示任意数字或字母

7、查找/var目录下属主为root,且属组为mail的所有文件或目录;

1
2
3
4
5
     [root@liu ~] # find /var -user root -group mail -ls
     262296    4 drwxrwxr-x   2 root     mail         4096 9月  4 15:35  /var/spool/mail
     262048    4 -rw-------   1 root     mail         2353 9月  3 17:33  /var/spool/mail/root
     #find命令格式:find [OPTION]... [查找路径] [查找条件] [处理动作]
     #find命令实现对属主,数组的匹配,使用-user 和-group来实现。

8、查找当前系统上没有属主或属组的文件;

1
2
3
4
5
6
7
8
9
10
11
     [root@liu ~] # find / -nouser -o -nogroup
     /home/mandirva
     /home/mandirva/ .gnome2
     /home/mandirva/ .bashrc
     /home/mandirva/ .mozilla
     /home/mandirva/ .mozilla /plugins
     /home/mandirva/ .mozilla /extensions
     /home/mandirva/ .bash_logout
     /home/mandirva/ .bash_profile
     /var/spool/mail/mandirva
     #-nouser 没有属主;-nogroup 没有数组

     进一步:查找当前系统上没有属主或属组,且最近3天内曾被访问过的文件或目录;

1
2
3
4
5
6
7
8
9
10
     [root@liu ~] # find / \( -nouser -o -nogroup \) -atime -3
     find : “ /proc/3759/task/3759/fd/5 ”: 没有那个文件或目录
     find : “ /proc/3759/task/3759/fdinfo/5 ”: 没有那个文件或目录
     find : “ /proc/3759/fd/5 ”: 没有那个文件或目录
     find : “ /proc/3759/fdinfo/5 ”: 没有那个文件或目录
     /home/mandirva
     /home/mandirva/ .gnome2
     /home/mandirva/ .mozilla
     /home/mandirva/ .mozilla /plugins
     /home/mandirva/ .mozilla /extensions

9、查找/etc目录下所有用户都有写权限的文件;

1
2
3
4
5
6
7
     [root@liu ~] # find /etc -perm -222
     /etc/rc .d /rc1 .d /K73winbind
     /etc/rc .d /rc1 .d /K92iptables
     /etc/rc .d /rc1 .d /K99rngd
     /etc/rc .d /rc1 .d /K84wpa_supplicant
     /etc/rc .d /rc1 .d /K89portreserve
     ...

    #根据权限查找
        -perm [+|-]MODE
            MODE: 精确权限匹配
            +MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可;
            -MODE:每一类对象都必须同时拥有为其指定的权限标准;
            -222:表示每一个用户都有写权限。
10、查找/etc目录下大于1M,且类型为普通文件的所有文件;

1
2
3
4
     [root@liu ~] # find /etc/ -type f -size +1M
     /etc/selinux/targeted/modules/active/policy .kern
     /etc/selinux/targeted/policy/policy .24
     /etc/gconf/gconf .xml.defaults/%gconf-tree.xml

    #根据类型查找:
            -type TYPE:
                f: 普通文件
                d: 目录文件
                l: 符号链接文件
                s:套接字文件
                b: 块设备文件
                c: 字符设备文件
                p: 管道文件
    #根据文件大小查找:
                -size [+|-]#UNIT
                常用单位:k, M, G

                #UNIT: (#-1, #]
                -#UNIT:[0,#-1]
                +#UNIT:(#,oo)

11、查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的文件;

1
2
     [root@liu ~] # find /etc/init.d -perm -113 -ls
     652914    0 lrwxrwxrwx   1 root     root           11 2月 12  2015  /etc/init .d -> rc.d /init .d

12、查找/usr目录下不属于root、bin或hadoop的文件;

1
2
3
4
5
     [root@liu ~] # find /usr -not \( -user root -o -user bin -o -user hadoop \) -ls
      20956    8 -rwsr-xr-x   1 abrt     abrt         6700 11月 23  2013  /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache
或者:
     [root@liu ~] # find /usr -not -user root -a -not -user bin -a -not -user hadoop -ls
      20956    8 -rwsr-xr-x   1 abrt     abrt         6700 11月 23  2013  /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache

13、查找/etc/目录下至少有一类用户没有写权限的文件;

1
2
3
4
5
     [root@liu ~] # find /etc -not  -perm -222 -ls
     652802   12 drwxr-xr-x 118 root     root        12288 9月  4 15:35  /etc
     652826    0 -rw-r--r--   1 root     root            0 1月 12  2010  /etc/exports
     661961    4 drwxr-xr-x   2 root     root         4096 8月 30 23:52  /etc/glances
     662033    4 -rw-r--r--   1 root     root         3288 1月 18  2014  /etc/glances/glances .conf

    ...
14、查找/etc目录下最近一周内其内容被修改过,且不属于root或hadoop的文件;
创建一个文件并修改权限:

1
2
3
4
5
6
7
8
9
10
     [root@liu etc] # cat > findtest.txt <<EOF
     > 123123
     > Hello!!
     > How are you !
     > EOF
     [root@liu etc] # chown liu.liu findtest.txt
     [root@liu etc] # ls -l findtest.txt
     -rw-r--r--. 1 liu liu 29 9月   5 05:07 findtest.txt
     [root@liu etc] # find /etc -mtime -7 -not -user root -not -user hadoop
     /etc/findtest .txt