day14-linux三剑客

01.sed
sed作用: 过滤(类似grep) 替换 修改 格式化输出
语法结构:
		 sed '模式 动作'  file

		 sed '找谁 干啥'  file
		 三剑客都支持处理屏幕上显示的信息
		 ip a|sed '找谁 干啥'
参数选项:
	   -n 取消默认输出

模式: 查找文件的字符串的行 怎么找
动作: 找到内容后的动作 增删改查
	  p   # print 输出  打印

[root@oldboy:~]# cat -n oldboy.txt
     1	I am lizhenya teacher!
     2	I teach linux.
     3	test
     4
     5	I like badminton ball ,billiard ball and chinese chess!
     6	my blog is http: blog.51cto.com
     7	our site is http:www.lizhenya.com
     8	my qq num is 593528156
     9
    10	aaaa,
    11	not 572891888887.
    12	^^^^^^^^66$$$$$$$^^^$$
    13	lizhenyalizhenyalizhenya


sed 指定行查找。
案例1.sed按照行查找
[root@oldboy:~]# sed -n '3p' oldboy.txt
test


案例2.sed输出最后一行 $
[root@oldboy:~]# sed -n '$p' oldboy.txt
lizhenyalizhenyalizhenya

案例3.区间范围使用逗号,表示区间范围
[root@oldboy:~]# sed -n '3,5p' oldboy.txt
test

I like badminton ball ,billiard ball and chinese chess!

案例4.sed输出10到最后一行
[root@oldboy:~]# sed -n '10,$p' oldboy.txt
aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
lizhenyalizhenyalizhenya



2.sed 模糊过滤
作用: 过滤文件中的字符串 类似grep
支持正则:
语法结构:grep '字符串' file
		sed -n '/字符串/p' file
        sed -n '/[xxx]/p' file
案例1.查找包含root的行
[root@oldboy:~]# head -3 /etc/passwd > p.txt

[root@oldboy:~]# sed -n '/root/p' p.txt
root:x:0:0:root:/root:/bin/bash

案例2.查找包含bash的行
[root@oldboy:~]# sed -n '/bash/p' p.txt
root:x:0:0:root:/root:/bin/bash


案例3.使用正则,查找以r开头的行
[root@oldboy:~]# sed -n '/^r/p' p.txt
root:x:0:0:root:/root:/bin/bash

案例4.查找以n结尾的行
[root@oldboy:~]# sed -n '/n$/p' p.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin


案例5.查找包含root或者sync的行
[root@oldboy:~]# sed -rn '/root|sync/p' p.txt
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
operator:x:11:0:operator:/root:/sbin/nologin


案例6.查找包含或a 或b 或 c的行
[root@oldboy:~]# sed -rn '/[abc]/p' p.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
...

或者使用|
[root@oldboy:~]# sed -rn '/a|b|c/p' p.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
...

案例7.查找字符串的区间范围使用逗号,查找adm和sync中间的行
sed -n '3,5p' file
sed -n '/amd/,/sync/p'

[root@oldboy:~]# sed -n '/adm/,/sync/p' p.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

[root@oldboy:~]# sed -n '/^adm/,/^sync/p' p.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

匹配区间范围注意:
唯一的字符串
1.如果有两个结尾,则只匹配到第一个结尾终止。
2.如果只有开头,没有匹配到结尾,则输出开头到文件末尾

案例: 匹配时间昨天1小时的数据。把时间作为字符串来匹配
[root@linuxnc ~]# sed -n '/2024:09:07:12/,/2024:09:57:53/p' /var/log/nginx/access.log

3.sed 删除
语法结构: 	sed '3d' file

[root@oldboy:~]# cat 33.txt
11111111
2222222222
test
33333333
oldboy
oldgirl 222


案例1.指定行删除
[root@oldboy:~]# sed '3d' 33.txt
11111111
2222222222
33333333
oldboy
oldgirl 222


案例2.删除第3-5行
[root@oldboy:~]# sed '3,5d' 33.txt
11111111
2222222222
oldgirl 222

删除第3行-末尾
[root@oldboy:~]# sed '3,$d' 33.txt


案例3.删除模糊过滤的行
[root@oldboy:~]# sed '/oldboy/d' 33.txt
11111111
2222222222
test
33333333
oldgirl 222

[root@oldboy:~]# sed -r '/test|oldboy/d' 33.txt
11111111
2222222222
33333333
oldgirl 222

案例4.删除区间范围test和oldboy之间的行
[root@oldboy:~]# sed '/test/,/oldboy/d' 33.txt
11111111
2222222222
oldgirl 222
4.sed 增加内容
语法结构:
		sed '3c hehe' file  # 将第3行替换成hehe    # 掌握
		sed '3i test' file  # 在第3行出插入test字符串
		sed '3a test' file  # 在第3行的下面追加test字符串
案例: 将第3行替换成hehe
[root@oldboy:~]# sed '3c hehe' p.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
hehe
adm:x:3:4:adm:/var/adm:/sbin/nologin

案例2.在第3行插入test字符串
[root@oldboy:~]# sed '3i test' p.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
test
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin


案例3.在第3行处追加test字符串
[root@oldboy:~]# sed '3a test' p.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
test
adm:x:3:4:adm:/var/adm:/sbin/nologin

5.sed 替换
语法结构:
		sed 's#root#oldboy#g' file  # 将文件中所有的root替换成oldboy
		sed 's///g' file
		sed 's@@@g' file

案例1.将root替换为oldboy
[root@oldboy:~]# sed 's#root#oldboy#g' p.txt
oldboy:x:0:0:oldboy:/oldboy:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/oldboy:/sbin/nologin

案例2.只替换行里的第一个root为oldboy
[root@oldboy:~]# sed 's#root#AAA#' p.txt
AAA:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin



案例3.将开头替换成#  批量注释
[root@oldboy:~]# sed 's/^/#/g' p.txt
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#sync:x:5:0:sync:/sbin:/bin/sync
#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#halt:x:7:0:halt:/sbin:/sbin/halt
#mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#operator:x:11:0:operator:/root:/sbin/nologin

模式+动作
语法格式:
		sed ‘3s###g’ file

		sed -n '3p' file  # 指定行查找,有n就有p。没p就没n
		sed '3s###g'file  # 模式+动作
		sed '/root/s###g' # 模式+动作

案例1.将第3行的a 替换成A
[root@oldboy:~]# sed '3s#a#A#g' p.txt
dAemon:x:2:2:dAemon:/sbin:/sbin/nologin
或者:
[root@oldboy:~]# sed -n '3s#a#A#gp' p.txt
dAemon:x:2:2:dAemon:/sbin:/sbin/nologin


案例2.第3-5行小a替换成A
[root@oldboy:~]# sed  '3,5s#a#A#g' p.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
dAemon:x:2:2:dAemon:/sbin:/sbin/nologin
Adm:x:3:4:Adm:/vAr/Adm:/sbin/nologin
lp:x:4:7:lp:/vAr/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

案例3.将包含root的行 将bash 替换成test
[root@oldboy:~]# sed '/root/s#bash#test#g' p.txt
root:x:0:0:root:/root:/bin/test
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

案例4.只替换bin为test
[root@oldboy:~]# cat p.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
边界符
[root@oldboy:~]# sed '2s#\<bin\>#test#g' p.txt
root:x:0:0:root:/root:/bin/bash
test:x:1:1:test:/test:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

永久替换文件内容加参数 -i
[root@oldboy:~]# sed -i 's#root#AAA#g' p.txt
[root@oldboy:~]# cat p.txt
AAA:x:0:0:AAA:/AAA:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

案例5.替换p.txt中所有的字符
[root@oldboy:~]# sed 's#[a-z]##g' p.txt
AAA::0:0:AAA:/AAA://
::1:1::/://
::2:2::/://
::3:4:://://
::4:7::///://
::5:0::/://
::6:0::/://
::7:0::/://
::8:12::///://
::11:0::/AAA://
[root@oldboy:~]# sed 's#[a-Z]##g' p.txt   # 小a-z  大A-Z


[root@oldboy:~]# sed 's#[0-Z]##g' p.txt   # 0-9 a-z  A-Z
[root@oldboy:~]# sed 's#[:/0-9]# #g' p.txt |xargs -n1|sort |uniq -c|sort -rn|head
     12 sbin
     10 x
      6 nologin
      5 bin
      4 AAA
      3 var
      3 sync
      3 shutdown
      3 mail
      3 halt


注意: -在中括号写到量变,如果在两个符号的中间报错,表示区间。
[root@oldboy:~]# sed 's#[-:/]# #g' p.txt |xargs -n1|sort |uniq -c|sort -rn|head
     12 sbin
     10 x
      6 nologin
      6 0

6.sed 后向引用
语法结构:
[root@oldboy:~]# echo oldboy|sed -r 's#(oldboy)#\1#g'
oldboy
[root@oldboy:~]# echo oldboy|sed -r 's#(ol)d(bo)y#\1#g'
ol
[root@oldboy:~]# echo oldboy|sed -r 's#(ol)d(bo)y#\2#g'
bo
[root@oldboy:~]# echo oldboy|sed -r 's#(ol)d(bo)y#\1\2#g'
olbo
[root@oldboy:~]# echo oldboy|sed -r 's#(ol)d(bo)y#\1 \2#g'
ol bo
[root@oldboy:~]# echo oldboy|sed -r 's#(.*)#\1#g'
oldboy
[root@old


使用后向引用取出IP地址
[root@oldboy:~]# ifconfig ens33|sed -rn '2s#^.*inet (10.0.0.200)  net.*$#\1#gp'
10.0.0.200
[root@oldboy:~]#
[root@oldboy:~]# ifconfig ens33|sed -rn '2s#^.*inet (.*)  net.*$#\1#gp'
10.0.0.200


取出IP地址和子网掩码
[root@oldboy:~]# ifconfig ens33|sed -rn '2s#^.*inet (.*)  net.* (.*)  br.*$#\1 \2#gp'
10.0.0.200 255.255.255.0

-n 回车换行
[root@oldboy:~]# ifconfig ens33|sed -rn '2s#^.*inet (.*)  net.* (.*)  br.*$#\1\n\2#gp'
10.0.0.200
255.255.255.0

使用后向引用格式化输出
[root@oldboy:~]# sed -ri 's#(.*)#o\1#g' p.txt
[root@oldboy:~]# cat p.txt
oAAA:x:0:0:AAA:/AAA:/bin/bash
obin:x:1:1:bin:/bin:/sbin/nologin
odaemon:x:2:2:daemon:/sbin:/sbin/nologin
oadm:x:3:4:adm:/var/adm:/sbin/nologin




sed小结:
1.sed指定行查找
  sed -n '3p' file
  sed -n '3,5p' file
  sed -n '$p' file
2.sed模糊过滤字符串 支持正则 ^ $ [] | .*
  sed -n '//p' file
  sed -n '//,//p' file
  sed -n '/^r/p'  file
3.sed删除
  sed '3d' file
  sed '3,5d' file
  sed '/字符串/d' file
  sed '//,//d'   file   时间区间范围
4.增加内容
  sed '3c' file  # 替换整行
  sed '3a' file  # 追加
  sed '3i' file  # 插入
5.sed替换
  sed 's###g' # 替换文件中所有的字符串为xx
  sed 's///g'
  模式+动作
  sed '2s###g'# 指定行替换
  sed '/root/s###g' 包含root的行替换
  sed 's#[a-z]##g' 删除a-z的字符
6.后向引用
  echo oldboy|sed -r 's#(.*)#\1#g'  # 没行使用正则表示,并且输出想要的内容。
02.awk
awk语法结构:
 	      awk '{动作}'  file  # 如果不加动作默认就是输出
	      awk '{print xx}' file
	      awk '模式{动作}' file
	      awk '找谁 干啥'  file
找谁: 找行 找列 字符串
动作: 都是在{}
1.awk 指定行查找
语法结构:		awk 'NR==3' file
NR存放每行的行号
案例1.找出第3行
[root@oldboy:~]# awk 'NR==3' p.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin

比较符:
!= 不相等
== 相等
>  大于
>= 大于等于
<  小于
<= 小于等于
区间范围:
&& 并且
|| 或者

案例2.查找出大于5的行
[root@oldboy:~]# awk 'NR>5' p.txt
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/AAA:/sbin/nologin

案例3.输出小3的行
[root@oldboy:~]# awk 'NR<3'  p.txt
AAA:x:0:0:AAA:/AAA:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

案例4.查找大于2并且小于6的行
[root@oldboy:~]# awk 'NR>2&&NR<6' p.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

案例5.查找小于2或者大于5的行
[root@oldboy:~]# awk 'NR<2||NR>5' p.txt
AAA:x:0:0:AAA:/AAA:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/AAA:/sbin/nologin

案例6.查找不等于第3行的行,对第3行取反
[root@oldboy:~]# awk 'NR!=3' 33.txt
11111111
2222222222
33333333
oldboy
oldgirl 222

2.awk 取列
语法结构:
	   awk '{print $1}' file # 获取文件的第一列内容
awk默认以空格或者tab键作为列的分隔符

$0  # 表示每行的内容,所有
$1  # 表示第1列
$2  # 表示第2列
$n  # 表示第n列

NF  # 存放着最后一列的列好

案例1.输出文件的第1列内容
[root@oldboy:~]# cat 33.txt
oldboy      100     aa
oldgirl     99      bb
xiaoming    88 	    cc
xiaohong    0	    dd
xiaozi      33	    ee
xiaolang    56      ff
[root@oldboy:~]# awk '{print $1}' 33.txt
oldboy
oldgirl
xiaoming
xiaohong
xiaozi
xiaolang


案例2.输出文件的第2列
[root@oldboy:~]# awk '{print $2}' 33.txt
100
99
88
0
33
56

案例3.输出文件的最后一列
[root@oldboy:~]# cat 33.txt |awk '{print $NF}'
aa
bb
cc
dd
ee
ff

案例4.获取磁盘信息的最后一列
[root@oldboy:~]# df -h|awk '{print $NF}'
on
/dev
/dev/shm
/run
/sys/fs/cgroup
/
/tmp
/boot
/run/user/0
/mnt

NF存储最后一列的列号:
[root@oldboy:~]# cat 33.txt
oldboy      100     aa
oldgirl     99      bb
xiaoming    88 	    cc
xiaohong    0	    dd
xiaozi      33	    ee
xiaolang    56      ff
[root@oldboy:~]# cat 33.txt|awk '{print NF}'
3
3
3
3
3
3
[root@oldboy:~]# cat 33.txt|awk '{print $NF}'
aa
bb
cc
dd
ee
ff

输出每行最后的列好
[root@oldboy:~]# cat 33.txt
oldboy      100     aa
oldgirl     99      bb
xiaoming    88 	    cc
xiaohong    0	    dd   33
xiaozi      33	    ee   tt
xiaolang    56      ff   ii  oo
[root@oldboy:~]# cat 33.txt|awk '{print NF}'
3
3
3
4
4
5

[root@oldboy:~]# cat 33.txt
oldboy      100     aa
oldgirl     99      bb
xiaoming    88 	    cc
xiaohong    0	    dd   33
xiaozi      33	    ee   tt
xiaolang    56      ff   ii  oo
[root@oldboy:~]# cat 33.txt|awk '{print NF}'
3
3
3
4
4
5
输出最后一列的内容
[root@oldboy:~]# cat 33.txt|awk '{print $NF}'
aa
bb
cc
33
tt
oo


案例: 取出文件的倒数第2列的内容
[root@oldboy:~]# cat 33.txt |awk '{print $(NF-1)}'
100
99
88
dd
ee
ii

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值