马哥运维班第五周作业

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了马哥运维班第五周作业相关的知识,希望对你有一定的参考价值。

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

#grep: -E:使用扩展正则表达式,即egrep,^:行首匹配,|:或者
#cut: -d:指定分隔符,-f:取第几列
[[email protected] 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替代,既可以匹配词首也可以匹配词尾
[[email protected] shell]# grep "\<[[:alpha:]]\+_\?[[:alpha:]]\+\>()" /etc/rc.d/init.d/functions
checkpid() {
daemon() {
killproc() {
pidfileofproc() {
pidofproc() {
status() {
echo_success() {


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

#文件名
#直接用basename看输出结果,是最后一个/后面的内容,当然如果后面有/应当去除
[[email protected] test]# basename /etc/init.d/httpd/
httpd
#grep -o "\<[^/]\+/\?$" :获取最后的/后面的非空字符
#cut -d‘/‘ -f1:以/为分隔符获取第一段字节内容
[[email protected] shell]# echo "/etc/init.d/httpd/" | grep -o "\<[^/]\+/\?$" | cut -d‘/‘ -f1
httpd


扩展:取出其路径名

#路径名,直接用dirname命令查看效果
[[email protected] test]# dirname /etc/init.d/httpd/
/etc/init.d
#grep -o "^/.*[^/]\+":去除最后一个无用的/
#awk -F ‘/[^/]*$‘ ‘{print $1}‘:查找路径
[[email protected] test]# echo /etc/init.d/httpd/ | grep -o "^/.*[^/]\+" | awk -F ‘/[^/]*$‘ ‘{print $1}‘
/etc/init.d


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

1.用grep拼接字符串

[[email protected] 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
#运行结果
[[email protected] 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拼接字符串

#测试文件里放入一些测试数据
[[email protected] 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
[[email protected] 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

#稍微整理一下,二三四其实匹配模式是一样的,(.***)匹配三次即可
[[email protected] 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.数值比较

[[email protected] 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
#运行结果
[[email protected] test]# ./sixth.sh 192.168.1.2
192
168
1
2
192.168.1.2


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

邮箱地址规则

1)邮箱完整地址由用户名@域名组成

2)用户名最少三个字符,由由字母、数字、下划线组成,字母不区分大小写

3)域名应至少有一个 . 分隔,分隔的各部分至少2个字符,可能由字母、数字组成

#测试文件
[[email protected] shell]# cat mail.txt
[email protected]
[email protected]
[email protected]#有下划线,结果应该出现
[email protected]  #有两个 . ,结果应该出现
abcde           #没有@
[email protected]#没有.分隔符
#[:alnum:]:字母或数字,[[:alnum:]_]:字母或数字或下划线 ,{3,}:至少三次
#\.:至少出现一个.分隔符
#[[:alnum:]]:字母或数字,{2,}至少两个字符
#\.[[:alnum:]]{2,}:.数字或字符出现至少一次
[[email protected] shell]# egrep "[[:alnum:]_]{3,}@[[:alnum:]]{2,}(\.[[:alnum:]]{2,}){1,}$" mail.txt
[email protected]
[email protected]
[email protected]
[email protected]


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

#find: -user:匹配属主,-group:匹配属组
[[email protected] 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避免该错误
[[email protected] 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,∞)
[[email protected] ~]# 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,其他权限位无须考虑
[[email protected] ~]# 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,∞)
[[email protected] ~]# 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
[[email protected] ~]# 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的文件;

#注意()加转义符
[[email protected] ~]# 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:至少一类用户没有写权限
[[email protected] 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的文件;

[[email protected] test]# find /etc -mtime -7 -a -not -user root -a -not -user hadoop
或者:
[[email protected] test]# find /etc -mtime -7 -a -not \( -user root -o -user hadoop \)


如有错误之处,烦请看官评论里指点一下,小女子不胜感激。

以上是关于马哥运维班第五周作业的主要内容,如果未能解决你的问题,请参考以下文章

马哥第3期运维班第五周作业

马哥2016全新Linux+Python高端运维班第五周作业

马哥2016全新Linux+Python高端运维班第五周作业

马哥2016全新Linux+Python高端运维班第四期-第五次作业

马哥运维班第四周作业

马哥运维班第七周作业