本周作业内容:
1、显示当前系统上root、fedora或user1用户的默认shell;
code:
grep -E "^\b(root|fedora|user1)\b" /etc/passwd | cut -d ":" -f 1,7
因为我本地并没有另外2个用户,所以这里只显示 root 用户
要点:拓展正则与切分
2、找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行,形如:hello();
code:
grep -E "\b[[:alpha:]]+\b\(\)" /etc/rc.d/init.d/functions
要点:使用反斜线将括号转义
3、使用echo命令输出一个绝对路径,使用grep取出其基名;
假设路径为
/home/divent/max2-date
或者
/home/divent/max2_date/
思路一
如果尾部不包含反斜线,匹配最后一个不以反斜线开头字符串,可以使用模式:
echo "/home/divent/max2-date" | grep -Eo '[^/]+$'
如果路径尾部包含反斜线,给原有的模式添加一个步骤
echo "/home/divent/max2_date/" | grep -Eo '[^/]+/?$' | grep -Eo ".*[^/]"
思路二
使用 “ tr ” 命令将斜线转换为空格后再使用模式匹配
echo "/home/divent/max2-date" | tr "/" " " | grep -Eo "[[:space:]]+[^[:space:]]*[[:space:]]*$"
缺陷:无法匹配基名中包含空格的路径
扩展:取出其路径名
仿照思路一中的方法,将第一种方法前加上反斜线,然后重复多次,不匹配最后的斜线
echo "/home/divent/max2_date/" | grep -Eo "(\/.*[^\/])*"
4、找出ifconfig命令结果中的1-255之间数字;
5、挑战题:写一个模式,能匹配合理的IP地址;
这两道题放在一起吧
匹配合理 IP 地址,说实话看到这个我第一眼不会想到用正则来匹配,这不科学,我宁可写个 shell 脚本都不是很想用正则来进行匹配,不过既然题目这么要求,那就试一下
匹配个位数 0~9,然后十位数 10~99,然后百位数并且 100~199 200~255
grep -E "([0-9]|[0-9]{2}|1[0-9]{2}|2[0-5]{2})"
做了过滤处理,输出太多没有全部列出
有了上一个模式匹配合理 IP 就很简单了,将上面的模式加上“点”然后重复三次,最后再重复一次不加点的模式即可
grep -Eo "(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-5]{2})\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-5]{2})"
为了测试,将以下内容写入文件 testip 中,其中包含了一些不符合 IP 规则行
192.168.1.1 1273.0.0.1 255.0.0.0 192.168.1.102 256.255.255.255 172.345.673 123.65.84.0 0.0.0.0 132.567.34.11
这里可以看到模式将 256.255.255.255 以 56.255.255.255 的形式匹配了出来,如果要强行匹配的话还需要在模式的最前面加一个“^”字符即可
grep -Eo "^(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-5]{2})\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-5]{2})"
这里就不给出运行截图了
6、挑战题:写一个模式,能匹配出所有的邮件地址;
假设我们的邮件地址有英文、数字与下划线的组合(实际使用中很多邮件系统允许在邮件地址中加入下划线,或者邮件地址属于多级域名)
假设我们有文件 testmail ,写入以下内容
123@qq.com absdf_sdaf@163.com df23dsf@abc.com.cn gi123_jbi_ac@bbb.github.net
邮件地址必须以字母或数字开头,其中可能包含下划线,多级域名
grep -E "([[:alnum:]]+_*)+@[[:alnum:]]*(\.[[:alnum:]]+)+"
7、查找/var目录下属主为root,且属组为mail的所有文件或目录;
限制用户 -user root ,限制组 -group mail
find /var -user root -group mail
当前目录就是查找到的目标文件!!
8、查找当前系统上没有属主或属组的文件;
限制类型 type f ,限制所有者 -nouser ,限制拥有组 -nogroup
find / -type f \( -nouser -o -nogroup \)
进一步:查找当前系统上没有属主或属组,且最近3天内曾被访问过的文件或目录;
限制所有者 -nouser ,限制拥有组 -nogroup,限制修改时间 -atime -3
find / \( -nouser -o -nogroup \) -atime -3
这里我就不截图了,因为我本机上并没有这种文件
9、查找/etc目录下所有用户都有写权限的文件;
find /etc -perm -222
10、查找/etc目录下大于1M,且类型为普通文件的所有文件;
限制类型 type f ,限制大小 -size +1M
find /etc -type f -size +1M
11、查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的文件;
限制权限 -perm -113
find /etc/init.d/ -perm -113
12、查找/usr目录下不属于root、bin或hadoop的文件;
限制所有者 -not -user ,有2中写法
find /usr -not \( -user root -o -user bin -o -user hadoop \) find /usr -not -user root -not -user bin -not -user hadoop
实际截图中没有加入用户 hadoop ,因为本机没有这个用户
13、查找/etc/目录下至少有一类用户没有写权限的文件;
限制写权限 -not -perm -222
find /etc -not -perm -222
14、查找/etc目录下最近一周内其内容被修改过,且不属于root或hadoop的文件;
限制时期 -mtime -7 限制所有者 -not -user
find /etc -mtime -7 -not -user root -not -user hadoop find /etc -mtime -7 -not \( -user root -o -user hadoop \)
实际截图中没有加入用户 hadoop ,因为本机没有这个用户
但是我还是没有截图,因为执行过后本机并没有找到这个文件
转载于:https://blog.51cto.com/divent/1840696