三剑客练习题


grep练习题

a.找出有关root的行

[root@chaogelinux init.d]# grep 'root' /etc/passwd

b.找出root开头的行

[root@chaogelinux init.d]# grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash

c.匹配以root开头或者以yu开头的行,注意定位锚点

[root@chaogelinux init.d]# grep -E "^(root|yu)\>" /etc/passwd

d.过滤出bin开头的行,切显示行号

[root@chaogelinux init.d]# grep '^bin' /etc/passwd -n
2:bin:x:1:1:bin:/bin:/sbin/nologin

e.过滤出除了root开头的行

[root@chaogelinux init.d]# grep -v '^root' /etc/passwd -n

f.统计yu用户出现的次数

[root@chaogelinux init.d]# grep -c  '^yu' /etc/passwd
3

g.匹配yu用户,最多2次

[root@chaogelinux init.d]# grep -m 2 '^yu' /etc/passwd

h.匹配多文件,列出存在信息的文件名字

[root@chaogelinux data]# grep -l "root" pwd.txt  pwd2.txt  test1.sh
pwd.txt
pwd2.txt

1.显示/etc/passwd文件中不以/bin/bash结尾的行*

grep -v "/bin/bash$" /etc/passwd

2.找出/etc/passwd文件中的两位数或三位数

grep  "[0-9]\{2,3\}"  /etc/passwd  #注意这个,是找出包含了2或3个数字的行,不严谨,有误

正确思路,匹配完整的单词,只找到2-3个数字

[root@chaogelinux data]# grep  "\<[0-9]\{2,3\}\>"  /etc/passwd

3.找出文件中,以至少一个空白字符开头,后面是非空字符的行

[root@chaogelinux data]# cat lovers.txt
 I like my lover.
I love my lover.
He likes his lovers.
 He loves his lovers.
#she loves her cat




[root@chaogelinux data]# grep  -E  "^[[:space:]]+[^[:space:]]"  lovers.txt
 I like my lover.
 He loves his lovers.

4.找出lovers.txt文件中,所有大小写i开头的行

[root@chaogelinux data]# cat lovers.txt
 I like my lover.
I love my lover.
He likes his lovers.
 He loves his lovers.
#she loves her cat
i want ride my bike


[root@chaogelinux data]# grep -i "^i" lovers.txt
I love my lover.
i want ride my bike

[root@chaogelinux data]# grep "^[iI]" lovers.txt
I love my lover.
i want ride my bike

[root@chaogelinux data]# grep -E "^(i|I)" lovers.txt
I love my lover.
i want ride my bike

5.找出系统上root、yu、nobody用户的信息

注意,机器上可能存在多个近似用户,精确搜索得加上<>

[root@chaogelinux data]# grep -E "^\<(root|yu|nobody)\>" /etc/passwd
root:x:0:0:root:/root:/bin/bash
nobody:x:99:99:Nobody:/:/sbin/nologin
yu:x:1000:1000::/home/yu:/bin/bash

6.找出/etc/init.d/functions文件中的所有函数名

提示:找出这样的结果
checkpid()
checkpids()
kill()
run()
pidof()
daemon()
killproc()

[root@chaogelinux init.d]# grep -E "[a-zA-Z]+\(\)" /etc/init.d/functions   -o
[root@chaogelinux init.d]# grep -E "[[:alnum:]]+\(\)" /etc/init.d/functions  -o

7.找出用户名和shell相同的用户

[root@chaogelinux init.d]# grep -E "^([^:]+\>).*\1$" /etc/passwd

sed练习题

提示,sed命令加上-i参数将结果写入到文件

准备文件pwd2.txt

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false
ba:x:1002:1002::/home/zhangy:/bin/bash
daemon:x:2:2:daemon:/sbin:/bin/false
mail:x:8:12:mail:/var/spool/mail:/bin/false
ftp:x:14:11:ftp:/home/ftp:/bin/false
&nobody:$:99:99:nobody:/:/bin/false
http:x:33:33::/srv/http:/bin/false
dbus:x:81:81:System message bus:/:/bin/false
hal:x:82:82:HAL daemon:/:/bin/false
mysql:x:89:89::/var/lib/mysql:/bin/false
aaa:x:1001:1001::/home/aaa:/bin/bash
test:x:1003:1003::/home/test:/bin/bash

a.替换文件的root为chaoge,只替换一次,与替换所有

sed 's/root/chaoge/' pwd2.txt |grep chaoge
sed 's/root/chaoge/g' pwd2.txt |grep chaoge

b.替换文件所有的root为chaoge,且仅仅打印替换的结果

[root@chaogelinux data]# sed 's/root/chaoge/gp' pwd2.txt -n
chaoge:x:0:0:chaoge:/chaoge:/bin/bash

c.替换前10行bin开头的用户,改为C,且仅仅显示替换的结果

[root@chaogelinux data]# sed -n "1,10s/^bin/C/gp" pwd2.txt

d.替换前10行b开头的用户,改为C,且将m开头的行,改为M,且仅仅显示替换的结果

[root@chaogelinux data]# sed -n -e "1,10s/^b/C/pg" -e "1,10s/^m/M/gp" pwd2.txt

e.删除4行后面所有

[root@chaogelinux data]# sed '4,$d' pwd2.txt

f.删除从root开始,到ftp之间的行

[root@chaogelinux data]# sed '/^root/,/^ftp/d' pwd2.txt

准备文件2

[root@chaogelinux data]# cat lovers.txt
 I like my lover.
I love my lover.
He likes his lovers.
 He loves his lovers.
#she loves her cat

1.将文件中空白字符开头的行,添加注释符

[root@chaogelinux data]# sed -e 's/^[[:space:]]/#/g' -e 's/^$/#/g' lovers.txt
#I like my lover.
I love my lover.
He likes his lovers.
#He loves his lovers.
#she loves her cat
#
#
#

2.删除文件的空白和注释行

[root@chaogelinux data]# sed '/^$/d;/^#/d' lovers.txt
 I like my lover.
I love my lover.
He likes his lovers.
 He loves his lovers.

3.给文件前三行,添加#符号

[root@chaogelinux data]# sed '1,3s/\(^.\)/#\1/g'  lovers.txt
# I like my lover.
#I love my lover.
#He likes his lovers.
 He loves his lovers.
#she loves her cat

4.sed取出ip地址

#多次管道符编辑
[root@chaogelinux data]# ifconfig eth0 |sed -n '2p' | sed 's/^.*inet//' | sed 's/netmask.*//'
 10.141.32.137

 #利用分组功能,引用ip地址
 [root@chaogelinux data]# ifconfig eth0 | sed -n '2p' | sed -r 's/^.*inet(.*)netmask.*/\1/'
 10.141.32.137

 #sed支持扩展正则 -r参数
 [root@chaogelinux data]# ifconfig eth0 | sed -r -n '2s/.*inet (.*)netmask.*/\1/p'
10.141.32.137

5.找出系统版本

[root@chaogelinux data]# cat /etc/centos-release
CentOS Linux release 7.7.1908 (Core)
[root@chaogelinux data]# sed -r -n 's/.*release[[:space:]]*([^.]+).*/\1/p' /etc/centos-release
7

awk练习题

1.在当前系统中打印出所有普通用户的用户和家目录(/etc/passwd)

[root@chaogelinux ~]# cat /etc/passwd | awk -F ":" '$3>=1000{print $1,"\t\t",$NF}'

2.给/tmp/chaoge.txt文件的前五行,添加#号

[root@chaogelinux tmp]# cat chaoge.txt
爱的魔力转圈圈1 爱的魔力转圈圈2 爱的魔力转圈圈3
爱的魔力转圈圈4 爱的魔力转圈圈5 爱的魔力转圈圈6
爱的魔力转圈圈7 爱的魔力转圈圈8 爱的魔力转圈圈9
爱的魔力转圈圈10 爱的魔力转圈圈11 爱的魔力转圈圈12
爱的魔力转圈圈13 爱的魔力转圈圈14 爱的魔力转圈圈15
爱的魔力转圈圈16 爱的魔力转圈圈17 爱的魔力转圈圈18
爱的魔力转圈圈19 爱的魔力转圈圈20

[root@chaogelinux tmp]# awk 'NR<6{print "#"$0}' chaoge.txt

3.统计文本信息

姓名 区号 电话 三个月捐款数量

Mike Harrington:[510] 548-1278:250:100:175

Christian Dobbins:[408] 538-2358:155:90:201

Susan Dalsass:[206] 654-6279:250:60:50

Archie McNichol:[206] 548-1348:250:100:175

Jody Savage:[206] 548-1278:15:188:150

Guy Quigley:[916] 343-6410:250:100:175

Dan Savage:[406] 298-7744:450:300:275

Nancy McNeil:[206] 548-1278:250:80:75

John Goldenrod:[916] 348-4278:250:100:175

Chet Main:[510] 548-5258:50:95:135

Tom Savage:[408] 926-3456:250:168:200

Elizabeth Stachelin:[916] 440-1763:175:75:300

显示所有电话号码

提示:
awk -F "[:]" '{print $1,$2}' tel.txt  #见到冒号就切一刀

awk -F "[ ]" '{print $1,$2}' tel.txt    #见到空格就切一刀

awk -F "[ :]" '{print $1,$2,$3,$4}' tel.txt  #见到空格或冒号,都切一刀

答案:
awk -F "[ :]" '!/^$/{print $4}' tel.txt  #排除空行,取出电话

显示Tom的电话

[root@chaogelinux tmp]# awk -F "[ :]+" '/^Tom/{print $4}' tel.txt
926-3456

显示Nancy的姓名、区号、电话

[root@chaogelinux tmp]# awk -F "[ :]" '/^Nancy/{print $1,$2,$4}' tel.txt
Nancy McNeil 548-1278

显示所有D开头的姓

[root@chaogelinux tmp]# awk -F "[ :]" '/^D/{print $2}' tel.txt
Savage
[root@chaogelinux tmp]# awk -F "[ :]" '$2~/^D/{print $2}' tel.txt
Dobbins
Dalsass

显示所有区号是916的人名

#针对第三列匹配正则,打印第一列
[root@chaogelinux tmp]# awk -F "[ :]" '$3~/\[916\]/{print $1}' tel.txt
Guy
John
Elizabeth

显示Mike的捐款信息,在每一款前加上美元符

[root@chaogelinux tmp]# awk -F "[ :]" '/^Mike/{print "$"$(NF-2),"$"$(NF-1),"$"$(NF)}' tel.txt
$250 $100 $175

*显示所有人的姓+逗号+名*

[root@chaogelinux tmp]# awk -v FS="[ :]"  -v OFS=","  '!/^$/{print $2,$1}' tel.txt
Harrington,Mike
Dobbins,Christian
Dalsass,Susan
McNichol,Archie
Savage,Jody
Quigley,Guy
Savage,Dan
McNeil,Nancy
Goldenrod,John
Main,Chet
Savage,Tom
Stachelin,Elizabeth

删除文件的空白行(awk不修改源文件),替换后的内容重定向写入新文件

[root@chaogelinux tmp]# awk '!/^$/{print $0}' tel.txt > tel2.txt
[root@chaogelinux tmp]# awk '!/^$/' tel.txt > tel2.txt

相关