- grep练习
- a.找出有关root的行
- b.找出root开头的行
- c.匹配以root开头或者以yu开头的行,注意定位锚点
- d.过滤出bin开头的行,切显示行号
- e.过滤掉除了root开头的行
- f.统计yu用户出现的次数
- g.匹配yu用户,最多2次
- h.匹配多文件,列出存在信息的文件名字
- 1.显示/etc/passwd文件中不以/bin/bash结尾的行*
- 2.找出/etc/passwd文件中的两位数或三位数
- 3.找出文件中,以至少一个空白字符开头,后面是非空字符的行
- 4.找出lovers.txt文件中,所有大小写i开头的行
- 5.找出系统上root、yu、nobody用户的信息
- 6.找出/etc/init.d/functions文件中的所有函数名
- 7.找出用户名和shell相同的用户
- sed练习题
- awk练习题
sed替换、删除、编辑 grep关键字搜素 awk格式化输出
grep练习
a.找出有关root的行
b.找出root开头的行
grep '^root' /etc/passwdroot:x:0:0:root:/root:/bin/bash
c.匹配以root开头或者以yu开头的行,注意定位锚点
grep -E "^(root|yu)\>" /etc/passwd # 以yu结束,yu1不算。
d.过滤出bin开头的行,切显示行号
grep '^bin' /etc/passwd -n2:bin:x:1:1:bin:/bin:/sbin/nologin
e.过滤掉除了root开头的行
grep -v '^root' /etc/passwd -n
f.统计yu用户出现的次数
g.匹配yu用户,最多2次
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/passwdgrep "[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.txtI like my lover.I love my lover.He likes his lovers.He loves his lovers.#she loves her cat# [[:space:]] 代表一个空格# ^ 表示开头 ^在[]中表示取反grep "^[[:space:]].*" lover.txt[root@chaogelinux data]# grep -E "^[[:space:]]+[^[:space:]]" lovers.txtI like my lover.He loves his lovers.
4.找出lovers.txt文件中,所有大小写i开头的行
[root@chaogelinux data]# cat lovers.txtI like my lover.I love my lover.He likes his lovers.He loves his lovers.#she loves her cati want ride my bike# -i 忽略大小写[root@chaogelinux data]# grep -i "^i" lovers.txtI love my lover.i want ride my bike[root@chaogelinux data]# grep "^[iI]" lovers.txtI love my lover.i want ride my bike[root@chaogelinux data]# grep -E "^(i|I)" lovers.txtI love my lover.i want ride my bike
5.找出系统上root、yu、nobody用户的信息
注意,机器上可能存在多个近似用户,精确搜索得加上<>
[root@chaogelinux data]# grep -E "^\<(root|yu|nobody)\>" /etc/passwdroot:x:0:0:root:/root:/bin/bashnobody:x:99:99:Nobody:/:/sbin/nologinyu: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相同的用户
# () 表示优先计算# \1 表示()# $ 表示找到结尾[root@chaogelinux init.d]# grep -E "^([^:]+\>).*\1$" /etc/passwd
sed练习题
提示,sed命令加上-i参数将结果写入到文件
准备文件pwd2.txt
root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/bin/falseba:x:1002:1002::/home/zhangy:/bin/bashdaemon:x:2:2:daemon:/sbin:/bin/falsemail:x:8:12:mail:/var/spool/mail:/bin/falseftp:x:14:11:ftp:/home/ftp:/bin/false&nobody:$:99:99:nobody:/:/bin/falsehttp:x:33:33::/srv/http:/bin/falsedbus:x:81:81:System message bus:/:/bin/falsehal:x:82:82:HAL daemon:/:/bin/falsemysql:x:89:89::/var/lib/mysql:/bin/falseaaa:x:1001:1001::/home/aaa:/bin/bashtest:x:1003:1003::/home/test:/bin/bash
a.替换文件的root为chaoge,只替换一次,与替换所有
sed -n 's/root/chaoge/p' pwd2.txt |grep chaogesed -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
[root@chaogelinux data]# cat lovers.txtI 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.删除文件的空白和注释行
sed -e '/^#/d' -e '/^$/d' lovers.txt[root@chaogelinux data]# sed '/^$/d;/^#/d' lovers.txtI like my lover.I love my lover.He likes his lovers.He loves his lovers.
3.给文件前三行,添加#符号
# 思路 把匹配到的地方,换成#加首字符sed -r '1,3s/(^.)/@\1/' lovers.txt[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地址
#多次管道符编辑ifconfig eth0 |sed -n '2p' | sed 's/^.*inet//' | sed 's/netmask.*//'10.141.32.137ifconfig eth0 | sed '2s/^.*inet//;s/network.*//p' -nifconfig eth0 | sed -e '2s/^.*inet//' -e 's/network.*//p' -n#利用分组功能,引用ip地址ifconfig eth0 | sed -n '2p' | sed -r 's/^.*inet(.*)netmask.*/\1/'10.141.32.137#sed支持扩展正则 -r参数ifconfig eth0 | sed -r -n '2s/.*inet (.*)netmask.*/\1/p'10.141.32.137
5.找出系统版本
[root@chaogelinux data]# cat /etc/centos-releaseCentOS Linux release 7.7.1908 (Core)[root@chaogelinux data]# sed -r -n 's/.*release[[:space:]]*([^.]+).*/\1/p' /etc/centos-release7
awk练习题
1.在当前系统中打印出所有普通用户的用户和家目录(/etc/passwd)

普通用户 uid>=1000cat /etc/passwd | awk -F ":" '$3>=1000{print $1,"\t\t",$(NF-1)}'
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:175Christian Dobbins:[408] 538-2358:155:90:201Susan Dalsass:[206] 654-6279:250:60:50Archie McNichol:[206] 548-1348:250:100:175Jody Savage:[206] 548-1278:15:188:150Guy Quigley:[916] 343-6410:250:100:175Dan Savage:[406] 298-7744:450:300:275Nancy McNeil:[206] 548-1278:250:80:75John Goldenrod:[916] 348-4278:250:100:175Chet Main:[510] 548-5258:50:95:135Tom Savage:[408] 926-3456:250:168:200Elizabeth 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的电话
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.txtNancy McNeil 548-1278
显示所有D开头的姓

[root@chaogelinux tmp]# awk -F "[ :]" '/^D/{print $2}' tel.txtSavage# 针对某一列进行正则匹配[root@chaogelinux tmp]# awk -F "[ :]" '$2~/^D/{print $2}' tel.txtDobbins Dalsass
显示所有区号是916的人名
#针对第三列匹配正则,打印第一列[root@chaogelinux tmp]# awk -F "[ :]" '$3~/\[916\]/{print $1}' tel.txtGuyJohnElizabeth
显示Mike的捐款信息,在每一款前加上美元符
awk -F "[ :]" '/^Mike/{print "$"$(NF-2),"$"$(NF-1),"$"$(NF)}' tel.txt$250 $100 $175
显示所有人的姓+逗号+名
# -V 修改内置变量[root@chaogelinux tmp]# awk -v FS="[ :]" -v OFS="," '!/^$/{print $2,$1}' tel.txtHarrington,MikeDobbins,ChristianDalsass,SusanMcNichol,ArchieSavage,JodyQuigley,GuySavage,DanMcNeil,NancyGoldenrod,JohnMain,ChetSavage,TomStachelin,Elizabeth
删除文件的空白行(awk不修改源文件),替换后的内容重定向写入新文件
[root@chaogelinux tmp]# awk '!/^$/{print $0}' tel.txt > tel2.txt[root@chaogelinux tmp]# awk '!/^$/' tel.txt > tel2.txt
