sed替换、删除、编辑 grep关键字搜素 awk格式化输出

grep练习

a.找出有关root的行

grep 'root' /etc/passwd

b.找出root开头的行

grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash

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

grep -E "^(root|yu)\>" /etc/passwd # 以yu结束,yu1不算。

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

grep '^bin' /etc/passwd -n
2:bin:x:1:1:bin:/bin:/sbin/nologin

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

grep -v '^root' /etc/passwd -n

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

grep -c '^yu' /etc/passwd

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

grep -m 2 '^yu' /etc/passwd

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

grep -l "root" pwd.txt pwd2.txt test1.sh pwd.txt pwd2.txt


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

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

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

grep -E "\<[0-9]{2,3}\>" /etc/passwd
grep "[0-9]\{2,3\}" /etc/passwd #注意这个,是找出包含了2或3个数字的行,不严谨,有误
三剑客练习题 - 图1
正确思路,匹配完整的单词,只找到2-3个数字
[root@chaogelinux data]# grep "\<[0-9]\{2,3\}\>" /etc/passwd
三剑客练习题 - 图2

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

  1. [root@chaogelinux data]# cat lovers.txt
  2. I like my lover.
  3. I love my lover.
  4. He likes his lovers.
  5. He loves his lovers.
  6. #she loves her cat
  7. # [[:space:]] 代表一个空格
  8. # ^ 表示开头 ^在[]中表示取反
  9. grep "^[[:space:]].*" lover.txt
  10. [root@chaogelinux data]# grep -E "^[[:space:]]+[^[:space:]]" lovers.txt
  11. I like my lover.
  12. He loves his lovers.

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

  1. [root@chaogelinux data]# cat lovers.txt
  2. I like my lover.
  3. I love my lover.
  4. He likes his lovers.
  5. He loves his lovers.
  6. #she loves her cat
  7. i want ride my bike
  8. # -i 忽略大小写
  9. [root@chaogelinux data]# grep -i "^i" lovers.txt
  10. I love my lover.
  11. i want ride my bike
  12. [root@chaogelinux data]# grep "^[iI]" lovers.txt
  13. I love my lover.
  14. i want ride my bike
  15. [root@chaogelinux data]# grep -E "^(i|I)" lovers.txt
  16. I love my lover.
  17. i want ride my bike

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

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

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

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

  1. 提示:找出这样的结果
  2. checkpid()
  3. checkpids()
  4. kill()
  5. run()
  6. pidof()
  7. daemon()
  8. killproc()
  9. [root@chaogelinux init.d]# grep -E "[a-zA-Z]+\(\)" /etc/init.d/functions -o
  10. [root@chaogelinux init.d]# grep -E "[[:alnum:]]+\(\)" /etc/init.d/functions -o

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

# () 表示优先计算
# \1 表示()
# $ 表示找到结尾
[root@chaogelinux init.d]# grep -E "^([^:]+\>).*\1$" /etc/passwd
三剑客练习题 - 图3

sed练习题

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

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

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

sed -n 's/root/chaoge/p' pwd2.txt |grep chaoge
sed -n 's/root/chaoge/pg' 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,且仅仅显示替换的结果

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

e.删除4行后面所有

$ 到最后一行
d 删除
[root@chaogelinux data]# sed '4,$d' pwd2.txt

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

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


准备文件2

  1. [root@chaogelinux data]# cat lovers.txt
  2. I like my lover.
  3. I love my lover.
  4. He likes his lovers.
  5. He loves his lovers.
  6. #she loves her cat

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

  1. # 思路 替换开头的空格为#,替换空行为#
  2. [root@chaogelinux data]# sed -e 's/^[[:space:]]/#/g' -e 's/^$/#/g' lovers.txt
  3. #I like my lover.
  4. I love my lover.
  5. He likes his lovers.
  6. #He loves his lovers.
  7. #she loves her cat
  8. #
  9. #
  10. #

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

  1. sed -e '/^#/d' -e '/^$/d' lovers.txt
  2. [root@chaogelinux data]# sed '/^$/d;/^#/d' lovers.txt
  3. I like my lover.
  4. I love my lover.
  5. He likes his lovers.
  6. He loves his lovers.

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

  1. # 思路 把匹配到的地方,换成#加首字符
  2. sed -r '1,3s/(^.)/@\1/' lovers.txt
  3. [root@chaogelinux data]# sed '1,3s/\(^.\)/#\1/g' lovers.txt
  4. # I like my lover.
  5. #I love my lover.
  6. #He likes his lovers.
  7. He loves his lovers.
  8. #she loves her cat

三剑客练习题 - 图4

4.sed取出ip地址

  1. #多次管道符编辑
  2. ifconfig eth0 |sed -n '2p' | sed 's/^.*inet//' | sed 's/netmask.*//'
  3. 10.141.32.137
  4. ifconfig eth0 | sed '2s/^.*inet//;s/network.*//p' -n
  5. ifconfig eth0 | sed -e '2s/^.*inet//' -e 's/network.*//p' -n
  6. #利用分组功能,引用ip地址
  7. ifconfig eth0 | sed -n '2p' | sed -r 's/^.*inet(.*)netmask.*/\1/'
  8. 10.141.32.137
  9. #sed支持扩展正则 -r参数
  10. ifconfig eth0 | sed -r -n '2s/.*inet (.*)netmask.*/\1/p'
  11. 10.141.32.137

5.找出系统版本

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

三剑客练习题 - 图5

awk练习题

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

三剑客练习题 - 图6
普通用户 uid>=1000
cat /etc/passwd | awk -F ":" '$3>=1000{print $1,"\t\t",$(NF-1)}'

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

  1. [root@chaogelinux tmp]# cat chaoge.txt
  2. 爱的魔力转圈圈1 爱的魔力转圈圈2 爱的魔力转圈圈3
  3. 爱的魔力转圈圈4 爱的魔力转圈圈5 爱的魔力转圈圈6
  4. 爱的魔力转圈圈7 爱的魔力转圈圈8 爱的魔力转圈圈9
  5. 爱的魔力转圈圈10 爱的魔力转圈圈11 爱的魔力转圈圈12
  6. 爱的魔力转圈圈13 爱的魔力转圈圈14 爱的魔力转圈圈15
  7. 爱的魔力转圈圈16 爱的魔力转圈圈17 爱的魔力转圈圈18
  8. 爱的魔力转圈圈19 爱的魔力转圈圈20
  9. [root@chaogelinux tmp]# awk 'NR<6{print "#"$0}' chaoge.txt

3.统计文本信息

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

  1. Mike Harrington:[510] 548-1278:250:100:175
  2. Christian Dobbins:[408] 538-2358:155:90:201
  3. Susan Dalsass:[206] 654-6279:250:60:50
  4. Archie McNichol:[206] 548-1348:250:100:175
  5. Jody Savage:[206] 548-1278:15:188:150
  6. Guy Quigley:[916] 343-6410:250:100:175
  7. Dan Savage:[406] 298-7744:450:300:275
  8. Nancy McNeil:[206] 548-1278:250:80:75
  9. John Goldenrod:[916] 348-4278:250:100:175
  10. Chet Main:[510] 548-5258:50:95:135
  11. Tom Savage:[408] 926-3456:250:168:200
  12. Elizabeth Stachelin:[916] 440-1763:175:75:300

显示所有电话号码

  1. 提示:
  2. awk -F "[:]" '{print $1,$2}' tel.txt #见到冒号就切一刀
  3. awk -F "[ ]" '{print $1,$2}' tel.txt #见到空格就切一刀
  4. # [] 表示任选其一
  5. awk -F "[ :]" '{print $1,$2,$3,$4}' tel.txt #见到空格或冒号,都切一刀
  6. 答案:
  7. awk -F "[ :]" '!/^$/{print $4}' tel.txt #排除空行,取出电话

显示Tom的电话

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

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

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

显示所有D开头的姓

三剑客练习题 - 图7
[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的人名

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

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

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

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

  1. # -V 修改内置变量
  2. [root@chaogelinux tmp]# awk -v FS="[ :]" -v OFS="," '!/^$/{print $2,$1}' tel.txt
  3. Harrington,Mike
  4. Dobbins,Christian
  5. Dalsass,Susan
  6. McNichol,Archie
  7. Savage,Jody
  8. Quigley,Guy
  9. Savage,Dan
  10. McNeil,Nancy
  11. Goldenrod,John
  12. Main,Chet
  13. Savage,Tom
  14. Stachelin,Elizabeth

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

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