本周作业内容:

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

code:

grep -E "^\b(root|fedora|user1)\b" /etc/passwd | cut -d ":" -f 1,7

因为我本地并没有另外2个用户,所以这里只显示 root 用户

wKioL1fLxvCinM0qAACrXSBp1o0193.png

要点:拓展正则与切分




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

code:

grep -E "\b[[:alpha:]]+\b\(\)" /etc/rc.d/init.d/functions

wKioL1fLx8HxkkrAAAE2Xt6Q-eI285.png

要点:使用反斜线将括号转义




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 ".*[^/]"

 wKioL1fMLoyzuPKSAAB4thW3o28877.png


思路二

        使用 “ tr ” 命令将斜线转换为空格后再使用模式匹配

echo "/home/divent/max2-date"  | tr "/" " " | grep -Eo "[[:space:]]+[^[:space:]]*[[:space:]]*$"

        缺陷:无法匹配基名中包含空格的路径




扩展:取出其路径名

        仿照思路一中的方法,将第一种方法前加上反斜线,然后重复多次,不匹配最后的斜线

echo "/home/divent/max2_date/"  | grep -Eo "(\/.*[^\/])*"

wKioL1fMMEHCTRNJAAB0oTiCSeY824.png




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})"

wKiom1fMNOHgclKaAABrk0GpsFk562.png

做了过滤处理,输出太多没有全部列出



有了上一个模式匹配合理 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

wKiom1fMOGvwbDJ0AACWCnOuwiQ744.png

这里可以看到模式将 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:]]+)+"

wKioL1fMQC6i8uLdAACeL5qV-Vc197.png




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

限制用户 -user root ,限制组 -group mail

find /var -user root -group mail

wKioL1fMQ-aRzOHMAAC6PDpRlM4831.png

当前目录就是查找到的目标文件!!




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

wKiom1fMT3KxygH9AACQgXdk8tA214.png



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

限制类型 type f ,限制大小 -size +1M

find /etc -type f -size +1M


wKiom1fMUarSQXmJAACipFlcmPY142.png




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

限制权限 -perm -113

find /etc/init.d/ -perm -113

wKiom1fMU0KzS9KeAACa15jcWpc970.png



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 ,因为本机没有这个用户

wKioL1fMVPHis35kAAGkHXzqnGw273.png


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

限制写权限 -not -perm -222

find /etc -not -perm -222

wKiom1fMVZeR4I23AADDXvzOmQI913.png




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 ,因为本机没有这个用户

但是我还是没有截图,因为执行过后本机并没有找到这个文件