linux之sed
sed
- 参数
- 取行
grep 参数
grep 参数选项
-v # 取反
-r # 递归过滤文件内容 从目录中递归查找
-w # 过滤的内容两边必须是空格
-E # 支持扩展正则 egrep
-i # 不区分大小写
-n # 过滤到内容行号
-c # 统计单词出现的次数
-o # 匹配过程
-A # 过滤到内容往下2行
-B # 过滤到内容往上2行
-C # 过滤到内容上下各2行
sed
- 1.取行
- 2.删除行
- 3.替换行
- 4.增加内容
- 5.后向引用
sed 参数
语法结构:
sed '模式+动作' file # 直接处理文件 效率比较高
cat file|sed '模式+动作' # 效率较低
其他命令的结果|sed 对显示到屏幕上的内容进行处理
模式: 找谁,按照行 模糊过滤查找文件内容
动作: 找到后干啥 显示 删除 替换 增加内容
语法格式:
sed -n 'np' file # n为数字 p为print输出结果
参数选项:
-n # 取消默认输出
-r # 支持扩展正则
-i # 修改源文件
sed取行
# 打印第三行身份证号
[root@m01 ~]# sed -n '3p' id.txt
赵 37142518322922103X
# 打印最后一行
[root@m01 ~]# sed -n '$p' id.txt
赵 37142518322922103X
# 打印文件中第3-5行
[root@m01 ~]# sed -n '3,5p' id.txt
赵 37142518322922103X
夏 222113859123487192
赵 37142518322922103X
# 打印文件第6行到尾部
[root@m01 ~]# sed -n '6,$p' id.txt
夏 222113859123487192
赵 37142518322922103X
夏 222113859123487192
赵 37142518322922103X
赵 37142518322922103X
夏 222113859123487192
赵 37142518322922103X
# 打印第二行 ,第五行号
[root@m01 ~]# sed -n '2p;5p' id.txt
夏 222113859123487192
赵 37142518322922103X
# 打印文本 带上行号
[root@m01 ~]# cat id.txt |grep -n .
1:孔 150000123874591242
2:夏 222113859123487192
3:赵 37142518322922103X
4:夏 222113859123487192
5:赵 37142518322922103X
6:夏 222113859123487192
7:赵 37142518322922103X
8:夏 222113859123487192
9:赵 37142518322922103X
10:赵 37142518322922103X
11:夏 222113859123487192
12:赵 37142518322922103X
sed模糊过滤查找内容
语法格式:
grep 'root' passwd
sed -n '/root/p' passwd # 模糊过滤查找包含root的行
sed -n '//,//p' passwd # 过滤区间范围的字符串 经常用来过滤日志中时间范围
匹配行
# sed -n '/root/p' == grep 'root'
[root@m01 ~]# sed -n '/root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@m01 ~]#
# sed -n '//,//p' 取一段时间内的日志
sed -n '/14:05:27/,/16:12:57/p' /var/log/nginx/access.log
# 查看以r开头的行
[root@m01 ~]# sed -n '/^r/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 查看以h结尾的行
[root@m01 ~]# sed -n '/h$/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
usera:x:1000:1000::/home/usera:/bin/bash
# 查看 以r开头 或者 以h结尾的行
# sed -r参数扩展正则
[root@m01 ~]# sed -nr '/^r|h$/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
usera:x:1000:1000::/home/usera:/bin/bash
# 查看以a 或者 r开头的行号
[root@m01 ~]# sed -nr '/^[ar]/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
[root@m01 ~]# sed -n '/nobody/,/ntp/p' /etc/passwd
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
sed删除
默认临时的输出到屏幕上不修改源文件
想要修改源文件需要加-i参数
语法结构:
sed '3d' # 指定删除第3行
sed '3,5d' # 区间范围删除
sed '/root/d' # 删除包含root的行
sed '/n$/d' # 使用正则表达式
删除
[root@m01 ~]# cat id.txt
孔 150000123874591242
夏 222113859123487192
赵 37142518322922103X
夏 222113859123487192
赵 37142518322922103X
夏 222113859123487192
赵 37142518322922103X
夏 222113859123487192
赵 37142518322922103X
赵 37142518322922103X
夏 222113859123487192
赵 37142518322922103X
# 删除第3行号
[root@m01 ~]# cat id.txt |sed '3d'
孔 150000123874591242
夏 222113859123487192
夏 222113859123487192
赵 37142518322922103X
夏 222113859123487192
赵 37142518322922103X
夏 222113859123487192
赵 37142518322922103X
赵 37142518322922103X
夏 222113859123487192
赵 37142518322922103X
# 删除3-5行
[root@m01 ~]# cat id.txt |sed '3,5d'
孔 150000123874591242
夏 222113859123487192
夏 222113859123487192
赵 37142518322922103X
夏 222113859123487192
赵 37142518322922103X
赵 37142518322922103X
夏 222113859123487192
赵 37142518322922103X
# 删除包含X的行
[root@m01 ~]# cat id.txt |sed '/X/d'
孔 150000123874591242
夏 222113859123487192
夏 222113859123487192
夏 222113859123487192
夏 222113859123487192
夏 222113859123487192
# 删除以2结尾的行号
[root@m01 ~]# cat id.txt |sed '/2$/d'
赵 37142518322922103X
赵 37142518322922103X
赵 37142518322922103X
赵 37142518322922103X
赵 37142518322922103X
赵 37142518322922103X
# 删除包含 1 2 9 7 0 的行
[root@m01 ~]# sed -r '/1|2|9|7|0/d' /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
sed之增加替换内容
sed之增加替换内容
sed '3a' # 在第3行追加内容
sed '3i' # 在第3行插入内容
sed '3c' # 将第3行完全替换
sed '3w w.txt' # 将第3行保存到新文件中
# 在第3行后插入
[root@m01 ~]# sed '3a hello' id.txt
孔 150000123874591242
夏 222113859123487192
赵 37142518322922103X
hello
# 在第3行前插入
[root@m01 ~]# sed '3i hello' id.txt
孔 150000123874591242
夏 222113859123487192
hello
# 将第3行替换
[root@m01 ~]# sed '3c hello' id.txt
孔 150000123874591242
夏 222113859123487192
hello
# 将第17行进行替换
# sed '17c Port 22' /etc/ssh/sshd_config
# 将第3行写入到新的文件中
[root@m01 ~]# sed '3w w.txt' id.txt
[root@m01 ~]# ls
1.txt 2.txt anaconda-ks.cfg doc dr id.txt w.txt
[root@m01 ~]#
# 将3-5行写入到w.txt中
[root@m01 ~]# sed '3,5w w.txt' id.txt
[root@m01 ~]# cat w.txt
赵 37142518322922103X
夏 222113859123487192
赵 37142518322922103X
sed 替换
语法格式:
sed 's#替换谁#替换成谁#g' file
sed 's///g' file
sed 's@@@g' file
sed 'sAAAg' file
# 将root 替换成ROOT
[root@m01 ~]# cat /etc/passwd |sed 's#root#ROOT#g'
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
# 替换每行出现的第一个单词
cat /etc/passwd |sed 's#u#HELLO#'
# 替换文件中的: 为-
[root@m01 ~]# cat /etc/passwd |sed 's#:#-#g'
root-x-0-0-root-/root-/bin/bash
bin-x-1-1-bin-/bin-/sbin/nologin
# 将【:/】 替换成 -
[root@m01 ~]# cat /etc/passwd |sed -r 's#:|/#-#g'
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
== 等同于
[root@m01 ~]# cat /etc/passwd |sed 's#[:/]#-#g'
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
# 删除文件中的a-z
[root@m01 ~]# cat /etc/passwd |sed 's#[a-z]##g'
::0:0::/://
::1:1::/://
::2:2::/://
# 删除a-z之外的所有内容
[root@m01 ~]# cat /etc/passwd |sed 's#[^a-z]##g'
rootxrootrootbinbash
binxbinbinsbinnologin
# 按照字母排序统计
[root@m01 ~]# cat /etc/passwd |sed 's#[^a-z]##g' |grep . -o |sort |uniq -c |sort -rn |head
86 n
78 o
66 s
58 i
41 b
39 t
38 a
36 l
35 e
31 r
# 按照单词排序统计
[root@m01 ~]# cat /etc/passwd |sed 's#[:x0-9/-]# #g' |xargs -n1 |sort |uniq -c |sort -rn |head
24 sbin
18 nologin
7 var
6 bin
4 root
3 sync
3 spool
3 shutdown
3 mail
3 halt
sed模式+动作进行替换
- 查找就等于模式 查找后的动作是输出p
# 将第4行的nologin替换为NOGLOGIN
[root@m01 ~]# cat /etc/passwd |sed '4s#nologin#NOGLOGIN#g'
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/NOGLOGIN
# 将第1行-3行的x替换成A
[root@m01 ~]# cat /etc/passwd |sed '1,3s#x#A#g'
root:A:0:0:root:/root:/bin/bash
bin:A:1:1:bin:/bin:/sbin/nologin
daemon:A:2:2:daemon:/sbin:/sbin/nologin
# 查找到包含root的行将x替换成X
[root@m01 ~]# cat /etc/passwd |sed '/root/s#x#X#g'
root:X:0:0:root:/root:/bin/bash
# 文件中test 替换成TEST 修改到文件 加-i参数
sed 's#test#TEST#g' -i /etc/passwd
# 将3-5行进行注释
[root@m01 ~]# cat /etc/passwd |sed '3,5s#^#\##g'
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
# 指定注释某行 查找root开头并注释该行
[root@m01 ~]# cat /etc/passwd |sed '/root/s#^#\##g'
#root:x:0:0:root:/root:/bin/bash
vim批量注释
ctrl+v 进入可视块模式
然后键盘上下键选择
选择后按大写的I 进入编辑模式
然后输入内容
完成后按两次ESC键即可
可视模式
按d 为删除
vim中替换动作
:s/root/ROOT/g # 只替换光标所在行的所有root
:%s/root/ROOT/g # 将文件中所有的root替换成ROOT
sed后向引用
语法结构:
sed 's#(正则)#\1#g' # \1获取第一个括号中的内容 \2获取第2个括号中的内容
# 将想要的内容输出
[root@m01 ~]# echo helloworld |sed -r 's#(hello)world#\1#g'
hello
[root@m01 ~]# echo helloworld |sed -r 's#(hello)(world)#\1\2#g'
helloworld
[root@m01 ~]# echo helloworld |sed -r 's#(.*)(world)#\1#g'
hello
[root@m01 ~]# echo helloworld |sed -r 's#(h.*o)(rld)#\1#g'
hellowo
[root@m01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
# 获取ip地址
[root@m01 ~]# ip a |sed -n '3p' |sed -r 's#(.*inet )(.*)(/)(.*)#\2#g'
127.0.0.1
# 批量添加用户
[root@m01 ~]# echo user{1..3} |xargs -n1 |sed -r 's#(.*)#useradd \1#g' |bash
useradd user1
useradd user2
useradd user3
# 批量修改密码
[root@m01 ~]# echo user{a..c} |xargs -n1 |sed -r 's#(.*)#useradd \1; echo 123456 |passwd --stdin \1#g' |bash
Changing password for user usera.
passwd: all authentication tokens updated successfully.
Changing password for user userb.
passwd: all authentication tokens updated successfully.
Changing password for user userc.
passwd: all authentication tokens updated successfully.
Never try,never know