第十一章:正则表达式课后习题
一、sed练习题
1.把/etc/passwd 复制到/root/test.txt,用sed打印所有行。
[root@zl_cloud ~]# cp /etc/passwd /root/test.txt
[root@zl_cloud ~]# sed -n '1,$'p test.txt
[root@zl_cloud ~]#
2.打印test.txt的第3行~第10行。
# sed -n ‘3,10’p test.txt
3.打印test.txt中包含root的行。
# sed -n ‘/root/’p test.txt
4.删除test.txt的第15行以及后面的所有行。
# sed ‘15,$’d test.txt
5.删除test.txt中包含bash的行。
# sed ‘/bash/’d test.txt
6.将 test.txt 中的 root 替换为 toor。
# sed ‘s/root/toor/g’ test.txt
7.将 test.txt 中的 /sbin/nologin 替换为 /bin/login
# sed ‘s#sbin/nologin#bin/login#g’ test.txt
8.删除test.txt第5行~第10行中所有的数字。
# sed ‘5,10s/[0-9]*//g’ test.txt
9.删除test.txt中所有的特殊字符(除了数字以及大小写字母)。
# sed ‘1,$s/[^0-9a-zA-Z]//g’ test.txt
10.把test.txt中第一个単词和最后一个单词调换位置。
# sed -r 's/(^[a-zA-Z]*)([^a-zA-Z].*[^a-zA-Z])([a-zA-Z]*$)/\3\2\1/' test.txt
一开始写成了这样,结果是把第一个字符串接到了最后一个字符串后面:
[root@zl_cloud ~]# sed -r ‘s/(^[a-zA-Z]*)(.*)((a-zA-Z)*$)/\3\2\1/g’ test.txt
然后不行,我就看了下答案,然后:
[root@zl_cloud ~]# sed -r 's/(^[a-zA-Z]*)(^[a-zA-Z].*^[a-zA-Z])([a-zA-Z]*$)/\3\2\1/' test.txt
反正没换成功。这里就关乎到概念的混淆了,这里讲一下^
在括号内和在括号外的区别 。
①[^字符串]
:这里^代表除括号内字符串的内容;
②^[字符串]
:这里^代表以该字符串的开始;
③^[^字符串]
:这里整体就表示除该字符串的整体。
11.把test.txt中出现的第一组数字(1个或多个)和最后一个单伺调换位置。
# sed -r 's/(^[^0-9]*)([0-9]*)([^0-9].*[^a-zA-Z])([a-zA-Z]+$)/\1\4\3\2/g' test.txt
12.把test.txt中第一个数字移动到本行末尾。
# sed -r 's/(^[^0-9]*)([0-9]*)([^0-9].*$)/\1\3\2/g' test.txt
13.在test.txt第20行到最后一行最前而加aaa 。
# sed -r '20,$s/^.*$/aaa&/' test.txt
二、awk练习题
1.用awk打印整个test.txt。 (以下操作都是针对test.txt的,用awk工具实现)
# awk ‘{print $0}’ test.txt
2.査找所有包含bash的行。
# awk ‘/bash/’ test.txt
3.用:作为分隔符,査找第3个字段等于0的行。
# awk -F ‘:’ ‘$3==”0”’ test.txt
4.用:作为分隔符,査找第1个字段为root的行,并把该段的root换成toor(可以连同sed一起使用。)
# awk -F ‘:’ ‘$1==”root”’ test.txt |sed ‘s/root/toor/g’
5.用:作为分隔符,打印最后一个字段。
# awk -F ‘:’ ‘{print $NF}’ test.txt
6.打印行数大于20的所有行。
# awk -F ‘:’ ‘NR>20’ test.txt
7.用:作为分隔符,打印所有第3个字段小于第4个字段的行。
# awk -F ‘:’ ‘$3<$4’ test.txt
8.用:作为分隔符,打印第1个字段以及最后一个字段,并且中间用@连接(例如,第1行应该是这样的形式:root@/bin/bash )
# awk -F ‘:’ ‘{print $1 “@”$NF}’ test.txt
9.用:作为分隔符,把整个文档的第4个字段相加,求和。
# awk -F ‘:’ ‘{(sum+=$4)}; END {print sum}’ test.txt
三、正则表达式课后练习
1.如何把/etc/passwd中用户uid大于500的行打印出来?
# awk -F ':' '$3>”500”' /etc/passwd
2.awk中变量NR和NF分别表示什么含义?命令awk -F ‘:’ '{print $NR}’ /etc/passwd会打印出 什么结果?
NR:表示行号;
NF:表示用分隔符分隔后一共有多少段。
[root@zl_cloud ~]# awk -F ':' '{print $NR}' /etc/passwd
root
x
2
4
lp
/sbin
/sbin/shutdown
[root@zl_cloud ~]#
[root@zl_cloud ~]#
他也就是打印出了对应段落的对应字符串。也就是第一行打印第一行的第一个字符串,第二行打印第二个字符串这样以此类推。不懂的话可以cat test.txt查看一下。
3.用grep把1.txt文档中包含abc或者123的行过滤出来,并在过滤出来的行前而加上行号。
# grep -E -n 'abc|123' 1.txt
4.命令grep -v ‘^$’ 1.txt会过滤出哪些行?
会过滤除非空行。
5.符号.、.和分别表示什么含义?符号+和?表示什么含义?这5个符号是否可以在grep、egrep、sed以及awk中使用?
-
.
:代表一个任意字符; -
.*
:代表零个或多个任意字符,包括空行; -
*
:代表前面紧邻的字符有零个或多个。即前面紧邻的字符可以不存在,也可以有多个那个字符; -
+
:表示前面紧邻的那个字符有一个或多个; -
?
:表示前面紧邻的那个字符有零个或一个。
grep和sed可以使用前三个,egerp和awk可以全部使用。
6.grep里面的符号{}用在什么情况下?
符号{ },其内部为数字,表示前面的字符要重复的次数。需要强调的是,{ }左右都需要加上转义字符。另使用{ }时还可以表示一个范围,具体格式为{n1,n2},n2还可以为空,这时表示大于等于n1次。
# grep ‘o\{2\}’ /etc/passwd
//这里意思就是查看该文件下出现2个o也就是oo的行。
7.sed有一个选项可以直接更改文本文件,是哪个选项?
-i选项。
8.sed -i 's/.* ie//;s/[“|&].*//’ file这条命令表示什么操作呢?
首先;把该命令分成了两个部分。第一部分表示把file文件以ie结尾的字符串删除。第二部分把file文件以“或者&开头的字符串删除。
9.如何删除一个文档中的所有数字或者字母?
删除所有数字:# sed -i ‘s/[0-9]//g’ filename
删除所有字母:# sed -i ‘s/[a-zA-Z]//g’ filename
10.截取日志1.log的第1个字段(以空格为分隔符),按数字排序,然后去重,但是需要保留重复的数量,如何做?
# awk -F ‘ ’ ‘{print $1}’ 1.log | sort -n | uniq -c
11.使用awk过滤出1.log中第7个字段(以空格为分隔符)为200并且第8个字段为11897的行。
# awk -F ‘ ’ ‘{$7==”200” && $8==”11897”}’ 1.log
12.请比较这两个命令的异同:grep -v ‘^[0-9]’ 1.txt
和grep ‘^[^0-9]’ 1.txt
。
# grep -v ‘^[0-9]’ 1.txt
//输出文件中不以数字开头的行,(也会输出空行)
# grep ‘^[^0-9]’ 1.txt
//输出文件中不以数字开头的行,(不会输出空行)
13.awk中的$0表示什么?为什么以下两条命令的$0结果不一致呢?
①# awk -F ‘:’ ‘(print $0}' 1.txt
//这个是打印所有的行
②# awk -F ‘:’ '$7=1 (print $0}’ 1.txt
//第七段内容改为1,并打印所有的行
14.使用grep过滤某个关键词时,如何把包含关键词的行连同上面一行打印出来?连同下面一行也打印呢?同时打印上下各一行呢?
①grep -B1;
②grep -A1;
③grep -C1;
15.使用sed与awk结合输出虚拟机当前ip地址。 环境就使用你们当前使用的任何一个虚拟机环境。
[root@zl_cloud ~]# sed -n '/IPADDR/'p /etc/sysconfig/network-scripts/ifcfg-eno16777736 | awk -F '=' '{print $2}'
192.168.10.129
[root@zl_cloud ~]#