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

PS:第一眼看到问题可能会有点头疼,那就把问题拆分完成,组合多个简单命令完成复杂工作

第一步,查找到这些用户并显示: 使用|或衔接多个过滤条件:
[root@CentOS7 ~]# grep -E "^root\>|^fedora\>|^user1\>" /etc/passwd   #grep -E也可使用egrep
root:x:0:0:root:/root:/bin/bash
user1:x:1003:1003::/home/user1:/bin/bash
fedora:x:1005:1005::/home/fedora:/bin/bash
第二步,将这些用户默认的shell显示出来:
[root@CentOS7 ~]# grep -E  "^root\>|^fedora\>|^user1\>" /etc/passwd | cut -d : -
f1,7
root:/bin/bash
user1:/bin/bash
fedora:/bin/bash


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

#方法一:使用grep正则表达式过滤,-o只显示匹配到的行:
[root@mylinux ~]# grep -Eo ".*[[:alpha:]]+\(\)" /etc/rc.d/init.d/functions
checkpid()
__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()
is_ignored_file()
is_true()
is_false()
apply_sysctl()


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

   扩展:取出其路径名

使用grep取出其基名:其中[^/]代表不是以/开头的,/?是考虑到路径有可能为目录

[root@mylinux tmp]# echo "/tmp/abc/12/122cb/mylinux.test" | grep -Eo "[^/]+/?$"
mylinux.test
取出其路径名:
[root@mylinux tmp]# echo "/tmp/abc/12/122cb/mylinux.test" | grep -o "/[A-Za-z0-9]\+.*/"
/tmp/abc/12/122cb/

或者:
[root@mylinux tmp]# echo "/tmp/abc/12/122cb/mylinux.test" | grep -o "/[[:alpha:]]\+.*/"
/tmp/abc/12/122cb/
想想,这会不会太麻烦了点,记得在bash特性之一路径补全教程上有关于基名和路径名的获取方式,basename和dirname:

[root@CentOS7 ~]# basename /tmp/abc/12/abd
abd
[root@CentOS7 ~]# dirname /tmp/abc/12/abd
/tmp/abc/12

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

第一步,先查看ifconfig命令有哪些值:
[root@CentOS7 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.15.35.204  netmask 255.255.254.0  broadcast 10.15.35.255
        inet6 fe80::20c:29ff:fe24:16e0  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:24:16:e0  txqueuelen 1000  (Ethernet)
        RX packets 44040  bytes 3257103 (3.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1240  bytes 149473 (145.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
思路,利用分段,把1-255分为一位两位三位数字,但是200-255之间比较特殊需要格外设置
于是乎:1-9,10-99,100-199,200-249,250-255
[root@CentOS7 ~]# ifconfig | egrep -o "\<[1-9]\>|\<[1-9][0-9]\>|\<[1][0-9][0-9]\>|\<[2][0-4][0-9]\>|\<[2][5][0-5]\>"
10
15
35
204
255
255
254
10
15
35
255
64
29
24
16
3
2
161
5
73
127
1
255
1
128


5、挑战题:写一个模式,能匹配合理的IP地址;

合理IP范围1.0.0.1 - 255.255.255.254

[root@CentOS7 ~]# ifconfig | egrep -o "(\<[1-9]\>|\<[1-9][0-9]\>|\<[1][0-9][0-9]\>|\<[2][0-4][0-9]\>|\<[2][5][0-5]\>)\.(\<[0-9]\>|\<[1-9][0-9]\>|\<[1][0-9][0-9]\>|\<[2][0-4][0-9]\>|\<[2][5][0-5]\>)\.(\<[0-9]\>|\<[1-9][0-9]\>|\<[1][0-9][0-9]\>|\<[2][0-4][0-9]\>|\<[2][5][0-5]\>).(\<[0-9]\>|\<[1-9][0-9]\>|\<[1][0-9][0-9]\>|\<[2][0-4][0-9]\>|\<[2][5][0-5]\>)"
10.15.35.204
255.255.254.0
10.15.35.255
127.0.0.1
255.0.0.0


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

鉴于邮箱名称可能包含的特殊符号为下划线_或者点.
[root@mylinux ~]# echo "email: My_li.nux123@126.com.cn 123@126.com  test22we%sin.com.cn" | egrep -o  "\<([a-zA-Z0-9_.]+)@([a-zA-Z0-9_.]+)\.([a-zA-Z]*)\>"
My_li.nux123@126.com.cn
123@126.com


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

[root@CentOS7 tmp]# find /var -user root -group mail -ls
33596404    0 drwxrwxr-x   2 root     mail           90 9月  1 15:58 /var/spool/mail
34464012    4 -rw-------   1 root     mail          632 8月 15 11:24 /var/spool/mail/root



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

[root@CentOS7 ~]# find / \( -nouser -o -nogroup \) -ls 
find: '/proc/8148/task/8148/fd/6': 没有那个文件或目录
find: '/proc/8148/task/8148/fdinfo/6': 没有那个文件或目录
find: '/proc/8148/fd/6': 没有那个文件或目录
find: '/proc/8148/fdinfo/6': 没有那个文件或目录
33781245    0 -rw-rw----   1 1006     mail            0 9月  2 14:52 /var/spool/mail/test1
   778    0 drwx------   2 1006     1006           59 9月  2 14:52 /home/test1
  1147    4 -rw-r--r--   1 1006     1006           18 8月  3 00:00 /home/test1/.bash_logout
363744    4 -rw-r--r--   1 1006     1006          193 8月  3 00:00 /home/test1/.bash_profile
517241    4 -rw-r--r--   1 1006     1006          231 8月  3 00:00 /home/test1/.bashrc


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

测试环境建立:由于userdel不加参数-r的时候家目录文件不会删除。

[root@mylinux ~]# useradd test12
[root@mylinux ~]# userdel test12
[root@mylinux ~]# find / \( -nouser -o -nogroup -a -atime -3 \) -ls
   139    0 drwx------   3 1000     1000           74 Sep  5 02:22 /home/test12
134217986    0 drwxr-xr-x   4 1000     1000           37 Aug 27 09:36 /home/test12/.mozilla
268656290    0 drwxr-xr-x   2 1000     1000            6 Jun 10  2014 /home/test12/.mozilla/extensions
402653442    0 drwxr-xr-x   2 1000     1000            6 Jun 10  2014 /home/test12/.mozilla/plugins
   140    4 -rw-r--r--   1 1000     1000           18 Aug  3 00:00 /home/test12/.bash_logout
   141    4 -rw-r--r--   1 1000     1000          193 Aug  3 00:00 /home/test12/.bash_profile
   142    4 -rw-r--r--   1 1000     1000          231 Aug  3 00:00 /home/test12/.bashrc
find: ‘/proc/4623/task/4623/fd/6’: No such file or directory
find: ‘/proc/4623/task/4623/fdinfo/6’: No such file or directory
find: ‘/proc/4623/fd/6’: No such file or directory
find: ‘/proc/4623/fdinfo/6’: No such file or directory
34465570    0 -rw-rw----   1 1000     mail            0 Sep  5 02:22 /var/spool/mail/test12
查看文件访问时间:使用stat命令

[root@mylinux ~]# stat /home/test12
  File: ‘/home/test12’
  Size: 74        	Blocks: 0          IO Block: 4096   directory
Device: fd02h/64770d	Inode: 139         Links: 3
Access: (0700/drwx------)  Uid: ( 1000/ UNKNOWN)   Gid: ( 1000/ UNKNOWN)
Context: unconfined_u:object_r:user_home_dir_t:s0
Access: 2016-09-05 02:36:22.150270911 +0800
Modify: 2016-09-05 02:31:46.066277576 +0800
Change: 2016-09-05 02:31:46.066277576 +0800
 Birth: -


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

[root@mylinux ~]# find /etc -perm -222 -ls
33595524    0 lrwxrwxrwx   1 root     root           17 Aug 27 09:36 /etc/mtab -> /proc/self/mounts
33975983    0 lrwxrwxrwx   1 root     root           49 Aug 27 10:45 /etc/pki/tls/certs/ca-bundle.crt -> /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
33975984    0 lrwxrwxrwx   1 root     root           55 Aug 27 10:45 /etc/pki/tls/certs/ca-bundle.trust.crt -> /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt


10、查找/etc目录下大于1M,且类型为普通文件的所有文件;

[root@mylinux ~]# find /etc \( -size +1M -a -type f \) -ls
594150 6824 -r--r--r--   1 root     root      6984832 Aug 27 10:45 /etc/udev/hwdb.bin
34988614 1304 -rw-------   1 root     root      1333775 Aug 27 10:46 /etc/selinux/targeted/contexts/files/file_contexts.bin
944900 3688 -rw-r--r--   1 root     root      3773563 Aug 27 10:46 /etc/selinux/targeted/policy/policy.29


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

[root@mylinux ~]# find /etc/init.d/ \( -type f -a -perm -112 \) -ls


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

[root@mylinux ~]# find /usr -not \( -user root -o -user bin -o -user hadoop \) -ls
17491411    0 drwx------   2 polkitd  root            6 Jun 24 02:13 /usr/share/polkit-1/rules.d
51170399   16 -rwsr-sr-x   1 abrt     abrt        15336 Dec  1  2015 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache


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

[root@mylinux ~]# find /etc -not -perm /222 -ls
33978125  192 -r--r--r--   1 root     root       194984 Aug 27 10:45 /etc/pki/ca-trust/extracted/java/cacerts
50710330  340 -r--r--r--   1 root     root       346654 Aug 27 10:45 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
451698  256 -r--r--r--   1 root     root       262042 Aug 27 10:45 /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
342390  204 -r--r--r--   1 root     root       208874 Aug 27 10:45 /etc/pki/ca-trust/extracted/pem/email-ca-bundle.pem
342391  208 -r--r--r--   1 root     root       208976 Aug 27 10:45 /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem
17606286    4 -r--r--r--   1 root     root          531 Sep  6  2015 /etc/lvm/profile/cache-mq.profile
17606288    4 -r--r--r--   1 root     root          338 Sep  6  2015 /etc/lvm/profile/cache-smq.profile
17606289    4 -r--r--r--   1 root     root         2249 Jun 29 02:01 /etc/lvm/profile/command_profile_template.profile
17606290    4 -r--r--r--   1 root     root          828 Jun 29 02:01 /etc/lvm/profile/metadata_profile_template.profile
17606291    4 -r--r--r--   1 root     root           76 Sep  6  2015 /etc/lvm/profile/thin-generic.profile
17606292    4 -r--r--r--   1 root     root           80 Sep  6  2015 /etc/lvm/profile/thin-performance.profile
33595559    4 ----------   1 root     root          457 Sep  5 02:31 /etc/gshadow-
33595567    4 ----------   1 root     root          693 Sep  5 02:31 /etc/shadow-
34465580    4 ----------   1 root     root          446 Sep  5 02:37 /etc/gshadow
594150 6824 -r--r--r--   1 root     root      6984832 Aug 27 10:45 /etc/udev/hwdb.bin
34430570    4 -r--r--r--   1 root     root           33 Aug 27 09:40 /etc/machine-id
34465576    4 ----------   1 root     root          664 Sep  5 02:37 /etc/shadow
51393329    4 -r--r--r--   1 root     root           63 Nov 20  2015 /etc/ld.so.conf.d/kernel-3.10.0-327.el7.x86_64.conf
50872368    4 -r--r--r--   1 root     root           63 Aug 19 03:17 /etc/ld.so.conf.d/kernel-3.10.0-327.28.3.el7.x86_64.conf
34297323    4 -r--------   1 root     root           45 Aug 27 09:39 /etc/openldap/certs/password
33974602    8 -r--r-----   1 root     root         4188 Mar 31 23:30 /etc/sudoers


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

[root@mylinux ~]# find /etc/ -type f -ctime -7  -a -not \( -user root -o -user hadoop \)



Find命令格式及参数:

1、find命令的一般形式为;

    find pathname -options [-print -exec -ok ...]

2、find命令的参数;

pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。

-print: find命令将匹配的文件输出到标准输出。

-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } ;,注意{ }和;之间的空格。

-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

3、find命令选项

-name

按照文件名查找文件。

-perm

按照文件权限来查找文件。

-prune

使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。

-user

按照文件属主来查找文件。

-group

按照文件所属的组来查找文件。

-mtime -n +n

按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。

-nogroup

查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。

-nouser

查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。

-newer file1 ! file2

查找更改时间比文件file1新但比文件file2旧的文件。

-type

查找某一类型的文件,诸如:

b - 块设备文件。

d - 目录。

c - 字符设备文件。

p - 管道文件。

l - 符号链接文件。

f - 普通文件。