Linux文本文件处理(4)

本文主要介绍sed命令的用法。

1. sed简介

Sed:Stream Editor 流式编辑器 又称行编辑器,每次只编辑一行。

2. 基本用法

1
# sed [OPTION]... {script-only-if-no-other-script} [input-file]...

选项与参数:
-n:只显示sed匹配到的行。其余行不显示。
-i:可以直接操作原文件。默认情况下sed不会改变原文件,但是-i选项可以修改原文件,此选项应慎用。
-r:可以使用标准正则表达式。默认情况下sed只支持基本正则表达式,但是加上-r选项后则支持扩展正则表达式
-e:可以同时执行多个命令
常用格式:
(1)Sed [options] ‘script’ input_file……
(2)Sed [options] -f script_file input_file……
(3)Sed [options] ‘ADDR1,ADDR2command’ input_file……
(4)Sed [options] ‘/PATTERN/command’ input_file……
(5)Sed ‘/PATTERN1/,/PATTERN2/command’ input_file……

常用命令(command)如下:

  • 打印p
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# sed -n '3p' /etc/passwd							--打印第3行
# sed -n '1,3p' /etc/passwd --打印第1到第3行
# sed -n '1,$p' /etc/passwd
# nl /etc/passwd | sed -n '5,7p' --打印第5到第7行
# head -5 /etc/passwd |sed -ne '1p;4p' --打印第1行和第4行

# nl /etc/passwd | sed -n '/root/p' --查找包含root的行
# cat /etc/passwd | sed -n '/^root/p'

# ifconfig eth1 | sed -n '2p' | awk -F: '{print $2}' | awk '{print $1}' --截取ip

# head -5 /etc/passwd |sed -ne '/^[[:upper:]]/p;/^[a-z]/p' --分别打印大写字母开头的行和小写字母开头的行
# head -5 /etc/passwd |sed -ne '/^[[:upper:]]/,/^[a-z]/p' --用正则表达式实现范围打印
# head -5 /etc/passwd |sed -ne '/^[[:upper:]]/,/nologin$/p'
# head -5 /etc/passwd |sed -n '/^[^[:blank:]]/p' --打印非空格开头的行

下面三条都是把有Accepted关键字的行打印出来
# awk '$0~"Accepted" {print $0}' /var/log/ssh.log
# sed -n '/Accepted/p' /var/log/ssh.log
# cat /var/log/ssh.log | grep Accepted

比较awk
# head -5 /etc/passwd |cat -n | sed -n '1,4p'
# head -5 /etc/passwd |cat -n | awk 'NR<5 {print $0}'

# head -5 /etc/passwd |cat -n | sed -n '1p;3p;5p'
# head -5 /etc/passwd |cat -n | awk 'NR==1 || NR==3 || NR==5 {print $0}'

# head -5 /etc/passwd |cat -n | sed -n '/root/p;/daemon/p;/lp/p'
# head -5 /etc/passwd |cat -n | awk '$0~"root" || $0~"daemon" || $0~"lp" {print $0}'
  • 删除d
    sed删除语法:
    sed ‘范围d’ file
    以行为单位删除,如果不指定范围,默认范围是整个文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# sed '1d' /etc/passwd 								删除第一行,第二行2d,第三行3d,以此类推,最后一行$d
# sed '1,3d' /etc/passwd 删除第1行到第3行,中间是逗号
# sed '1d;3d' /etc/passwd 删除第1行和第3行,中间是分号
# sed -e '1d' -e '3d' /etc/passwd 删除第1行和第3行
# sed --expression='1d' --expression='3d' /etc/passwd
# sed '/^root/d' /etc/passwd 使用正则表达式,要加双斜杠
# sed '/root/,/sync/d' /etc/passwd 删除包含root到sync的行
# sed '/root/!d' /etc/passwd !表示后面的命令对所有没有被选定的行发生作用

# head -n 5 /etc/passwd |cat -n |sed '2d' 指定删除第二行
# head -n 5 /etc/passwd |cat -n |sed '2,3d' 删除第二行到第三行,中间为逗号,表示范围
# head -n 5 /etc/passwd |cat -n |sed '1d;5d' 删除第一行和第五行,中间为分号,表示单独操作
# head -n 5 /etc/passwd |cat -n |sed '1d;5d;3d'
# head -n 5 /etc/passwd |cat -n |sed '1,3d;5d'
# head -5 /etc/passwd |sed '/daemon/d'

删除vsftpd.conf里所有的注释和空行
# sed '/^#/d;/^$/d' /etc/vsftpd/vsftpd.conf
  • 替换
    sed替换语法:
    sed ‘范围 s/老字符/新字符/标记’ file
    sed ‘范围 s#老字符#新字符#标记’ file
    如果不指定范围,默认范围是整个文件。
    sed ‘y/老字符/新字符/‘
1
2
3
4
5
6
7
8
# head -5 /etc/passwd | nl |sed '1,4s/nologin/NOLOGIN/g'
# sed 's#nologin#NOLOGIN#g' /etc/passwd g是标记,表示全部,也可以使用数字,1,2,3等进行替换,#号只有替换的时候才能用
# sed 's/nologin/NOLOGIN/g' /etc/passwd
# sed '1s/root/--&--/2' /etc/passwd 老字符支持正则表达式,新字符不支持正则表达式,除了"\n\&",这里的"&"表示前面的关键字
# sed '1{s/root/ROOT/;s/bin/BIN/}' /etc/passwd 多次替换使用花括号和分号
# sed 'y/abc/xyz/' file y也是替换,a->x b->y c->z
# cat /etc/sysconfig/network-scripts/ifcfg-eth0 | sed '/^onboot/c\onboot=yes' 将onboot开头的行替换成onboot=yes,行替换
# cat /etc/sysconfig/network-scripts/ifcfg-eth0 | sed 's/ONBOOT="no"/ONBOOT="yes"/'
  • 修改之后保存
1
# sed -i '/^root/a\the first line' file		--修改源文件的操作要谨慎
---------------- The End ----------------