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 - 普通文件。