18 - shell使用sed修改配置

常用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的打印、删除、行替换、关键词替换、显示行号等指令

你可能感兴趣的:(18 - shell使用sed修改配置)