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)