首页 > 代码库 > 第五周作业

第五周作业

 

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

# useradd fedora              
# useradd user1 
# grep -E "^(root|fedora|user1)\>" /etc/passwd |cut -d: -f1,7    (注意是使用扩展正则表达式)

 

^ :行首

| :或者

():将一个或多个字符捆绑在一起,当作一个整体进行处理

cut -d 分隔符 -fN,M :指定分隔符,取第N和第M字段

 

第1段为用户名,第7段为默认命令解析器(shell)

/etc/passwd格式:account:password:UID:GID:GECOS:diretory:shell

 

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

# grep -E -o "^[_[:alpha:]]+\(\)" /etc/rc.d/init.d/functions

 

查看functions文件可以留意到文件中存在"_字母()"的行,所在使用[_[:alpha:]]表示有_或大小写字母的字符集

+:前面字符可以出现一次或多次

\(\):需要使用转义符\表示为小括号()

 

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

# echo "/tmp/html/test.php" | grep -E -o "[^/]+$"
test

除了/斜线的任意内容出现1次以上,仅显示匹配的字符

# echo "/mnt/sdc/" | grep -E -o "[^/]+/?$" | cut -d"/" -f1

如果行尾出现斜杠/,需要添加/?则斜杠出现一次或零次,使用cut用/作为分隔符,取第1字段

# basename /tmp/html/test.php  #获取基名
test.php
# basename /tmp/html/test.php .php #去除指定后缀(也可以使用参数-s 后缀)
test


   扩展:取出其路径名

# echo "/tmp/html/test.php" | grep -o "/.*/"
# dirname /tmp/html/test.php  #获取指定路径所在的目录
/tmp/html

 

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

# ifconfig | egrep  -o "[1-9][1-9]?[1-9]?"

 

5、挑战题:写一个模式,能匹配合理的IP地址;

挑战失败

来源于网络收集(膜拜)

iPv4的ip地址都是(1~255).(0~255).(0~255).(0~255)的格式

称为点分十进制(由32位二进制转换)


所以可将正则表达式按点拆分为四段


^(1[0-9+]{2}|2[0-4][0-9+]|25[0-5]|[1-9][0-9+]|[1-9])\.
(1[0-9+]{2}|2[0-4][0-9+]|25[0-5]|[1-9][0-9+]|[0-9+])\.
(1[0-9+]{2}|2[0-4][0-9+]|25[0-5]|[1-9][0-9+]|[0-9+])\.
1[0-9+]{2}|2[0-4][0-9+]|25[0-5]|[1-9][0-9+]|[0-9+])$


技术分享

# echo -e "192.168.3.51\n10.1.a.1\na.v.b.d\n922.2.3.5"
192.168.3.51
10.1.a.1
a.v.b.d
922.2.3.5

 

 

#echo -e "192.168.3.51\n10.1.a.1\na.v.b.d\n922.2.3.5"|grep -E "^(1[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9][0-9]|[1-9])\.(1[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9][0-9+]|[0-9])\.(1[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9][0-9]|[0-9])\.(1[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9][0-9]|[0-9])$"
192.168.3.51


再附上超详细解析

 

^PATTERN$ 用于模式匹配整行

{2}表示前面字符正好出现两次

| 的意思是或者

( )上面的括号不能少,是为了匹配括号中整体字符串,表达式中有几个()就表示有几个相应的匹配字符串

[0-4]表示0~4的任何一个数字

[0-9]表示0~9的任何一个数字

[1-9]的意思是1~9之间的任意一个数字

[1-9][0-9]的意思是10~99之间的任意一个数字

1[0-9]{2}的意思就是100~199之间的任意一个数字

2[0-4][0-9]的意思是200~249之间的任意一个数字

25[0-5]的意思是250~255之间的任意一个数字

\.的意思是.点要转义为普通字符


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

连败

^[A-Za-z0-9](([_.-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([.-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$

 

技术分享


英文域名格式如下:域名由各国文字的特定字符集、英文字母、数字及“ - ” ( 即连字符或减号 ) 任意组合而成 , 但开头及结尾均不能含有“ - ”

 

再附上超详细解析

 

^[A-Za-z0-9]    行首为字母或数字开头

[_.-]?    出现0或者1次下划线,点,连字符

[a-zA-Z0-9]+    出现一次或多次大小写字母或者数字

()    括号中的字符为一个整体

@    电子邮件标识,用于分隔用户名和域名

*    出现任意次

[.-]?    出现0或者1次点,连字符

{2,}    前面的字符出现两次以上

$    匹配行尾


 

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

# find /var -user root -group mail

8、查找当前系统上没有属主或属组的文件;

# find / -nouser -o -nogroup

    进一步:查找当前系统上没有属主或属组,且最近3天内曾被访问过的文件或目录;

# find / -nouser -a -nogroup -a -atime -3

9、查找/etc目录下所有用户都有写权限的文件;

# find /etc -perm -222 -ls

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

# find /etc -size +1M -type f

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

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

12、查找/usr目录下不属于root、bin或hadoop的文件;

# find /usr -not \( -user root -o  -user bin -o  -user hadoop \

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

# find /etc -not -perm -222 -ls

14、查找/etc目录下最近一周内其内容被修改过,且不属于root或hadoop的文件

# find /etc -mtime -7 -not \( -user root -o -user hadoop \) -ls


知识点

按时间查找文件

-------(+n)-------|------------(n)-------------------|---------(-n)----


(n+1)×24小时前   |  (n+1)×24H ~ n×24小时之间    |  n×24小时以内



摩根定律:

!A -a !B = !(A -o B)

 


!A -o !B = !(A -a B)

 

 

第五周作业