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.
posted @ 2024-11-17 17:06  被时光移动的城市  阅读(6)  评论(0编辑  收藏  举报