常用sed指令
- p(print):打印行
- d(delete):删除行
- c(replace):替换行
- s(substitution):替换关键词
- =:打印行号
过滤数据
- print指令
sed -n '/IPADDR/p' /etc/sysconfig/network-scripts/ifcfg-enp0s3
IPADDR=192.168.0.125
free | sed -n '/Mem/p'
Mem: 3880248 313344 3312696 8776 254208 3344464
df -h | sed -n '/\/$/p' #过滤磁盘根分区信息(根分区是以/结尾的分区)
/dev/mapper/centos-root 26G 6.0G 20G 24% /
sed -n '1p;3p;6p' /etc/passwd #显示第1,3,6行内容
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
sed -n '2!p' /etc/hosts #打印第2行以外的所有其他行内容
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
删除数据
- delete指令(不使用-i选项,源文件不会被修改)
sed 'd' /etc/hosts #删除全文,没有定位条件等于匹配所有
cat /etc/fstab > fstab
sed '1,3d' fstab #1到3行都删除
sed '/dev/!d' fstab #不包含dev的行都删除
sed '/^#/d' fstab #删除所有以#符号开头的行
sed '/^$/d' fstab #删除所有空白行
替换行
- replace指令(不使用-i选项,源文件不会被修改)
sed 'c 123456' fstab #所有行被替换为123456
file=/etc/sysconfig/network-scripts/ifcfg-enp0s3
sed 'IPADDR/c IPADDR=1.1.1.1' $file #替换ip地址
sed '/127/c 127.0.0.1 localhost' /etc/hosts
sed '4c xxxx' /etc/shells #第四行替换为xxxx
替换关键词
- substitution指令(不使用-i选项,源文件不会被修改)
cat test.txt
2046 2048 2046 2046
1001 2046 2999 1888
2046 2046 2046 20462046 2048 2046 2046
1001 2046 2999 1888
2046 2046 2046 2046
sed 's/2046/XXXX/' test.txt #替换第一个词
XXXX 2048 2046 2046
1001 XXXX 2999 1888
XXXX 2046 2046 20462046 2048 2046 2046
1001 XXXX 2999 1888
XXXX 2046 2046 2046
sed 's/2046/XXXX/g' test.txt #替换所有的词
XXXX 2048 XXXX XXXX
1001 XXXX 2999 1888
XXXX XXXX XXXX XXXXXXXX 2048 XXXX XXXX
1001 XXXX 2999 1888
XXXX XXXX XXXX XXXX
sed 's/2046/XXXX/2' test.txt #替换第二个
2046 2048 XXXX 2046
1001 2046 2999 1888
2046 XXXX 2046 20462046 2048 2046 2046
1001 2046 2999 1888
2046 XXXX 2046 2046
sed 's/2046/(&)/g' test.txt
(2046) 2048 (2046) (2046)
1001 (2046) 2999 1888
(2046) (2046) (2046) (2046)(2046) 2048 (2046) (2046)
1001 (2046) 2999 1888
(2046) (2046) (2046) (2046)
sed '2s/2046/XXXX/g' test.txt #替换第二行
2046 2048 2046 2046
1001 XXXX 2999 1888
2046 2046 2046 20462046 2048 2046 2046
1001 2046 2999 1888
2046 2046 2046 2046
sed '2s/2046//g' test.txt
sed '2s/2046/XXXX/p' test.txt #替换后输出
2046 2048 2046 2046
1001 XXXX 2999 1888
1001 XXXX 2999 1888
2046 2046 2046 20462046 2048 2046 2046
1001 2046 2999 1888
2046 2046 2046 2046
- 替换符号:/ 可以使用其他字符
sed 's#2046#(&)#g' test.txt
(2046) 2048 (2046) (2046)
1001 (2046) 2999 1888
(2046) (2046) (2046) (2046)(2046) 2048 (2046) (2046)
1001 (2046) 2999 1888
(2046) (2046) (2046) (2046)
- 正则符号()具有保留功能
echo "hello the world" | sed -r 's/^(.)(.*)(.)$/\3\2\1/'
dello the worlh
匹配1:^号开头,任意字符开头(一个),(.) 匹配到h
匹配2:.*代表任意长度的任意字符,匹配到ello the worl(如后续无其他内容,则能匹配到d,这里只能不能)
匹配3:(.) 一定能匹配到一个字符,即:d
结果:用3和1交换位置,即为:dello the worlh
打印行号
- =
sed -n '1=' /etc/passwd
sed -n '/root/=' /etc/passwd
1
10
sed -n '/bash$/=' /etc/passwd
1
19
sed -n '$=' /etc/passwd #统计行号
19
wc -l /etc/passwd
19 /etc/passwd
小结
- 本文我们学习了sed的打印、删除、行替换、关键词替换、显示行号等指令
网友评论