1、显示当前系统上root、fedora或user1用户的默认shell;
#grep: -E:使用扩展正则表达式,即egrep,^:行首匹配,|:或者 #cut: -d:指定分隔符,-f:取第几列 [root@localhost shell]# grep -E "^root|fedora|user1" /etc/passwd | cut -d: -f1,7 root:/bin/bash
2、找出/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() {
3、使用echo命令输出一个绝对路径,使用grep取出其基名;
#文件名 #直接用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
扩展:取出其路径名
#路径名,直接用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
4、找出ifconfig命令结果中的1-255之间数字;
1.用grep拼接字符串
[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.数值比较
#!/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
5、挑战题:写一个模式,能匹配合理的IP地址;
我理解的合理的ip地址可能不太准确,1.0.0.0~255.255.255.254
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
6、挑战题:写一个模式,能匹配出所有的邮件地址;
邮箱地址规则
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
7、查找/var目录下属主为root,且属组为mail的所有文件或目录;
#find: -user:匹配属主,-group:匹配属组 [root@localhost shell]# find /var -user root -group mail /var/spool/mail /var/spool/mail/root
8、查找当前系统上没有属主或属组的文件;
#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
9、查找/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
10、查找/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
11、查找/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
12、查找/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
13、查找/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
14、查找/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 \)
如有错误之处,烦请看官评论里指点一下,小女子不胜感激。