在Linux下有两个非常强大的数据处理工具,一个是sed,另一个是awk。这里暂且介绍sed如何使用好了,作为备忘笔记,以便以后查看。
sed本身是一个管道命令,可以分析stdin的,而且sed可以将数据进行替换、删除、新增、选取特定行的功能。这里要明白的是,与awk将一行数据分为“多个字段”来处理相比,sed常常作用于一整行的处理。
首先,先了解下sed工具的用法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
hanson@linux-host:~$ sed [-nefir] [动作] 文件
参数:
-n:安静模式,加上-n后只有经过sed特殊处理过的数据才会显示在屏幕上,不加-n很可能会造成重复输出数据
-e:直接在命令行模式上进行动作编辑
-f:将sed动作写入一个文件,-f filename 则可以执行文件内的动作
-r:sed的动作支持的是扩展型正则表达式语法
-i:直接修改读取的文件内容,而不是输出到屏幕
动作:
n1,n2 [function]:选取n1,n2之间的行进行动作操作
function参数:
a:新增,会出现在下一行
i:插入,会出现在上一行
c:替换,c后面接字符串,可以替换n1,n2之间的行
s:替换,搭配正则表达式
d:删除,通常d后面不解参数
p:打印,一般与sed -n一起使用
|
新增与删除
将passwd文件的2,5行删除:
1
|
hanson@linux-host:~$ nl passwd | sed '2,5d'
|
注意:sed后跟的动作,必须在单引号之间。
在第一行的上一行新增加一行数据:
1
|
hanson@linux-host:~$ nl passwd | sed '1i This is a new line.'
|
当添加多行时,可以使用”\”来进行新行的增加:
1
2
|
hanson@linux-host:~$ nl passwd | sed '1a first line...\
> second line...'
|
注意:当使用”\”进行新行添加时,”\”后面务必紧跟enter健。
替换与显示
将2,5行替换为“2,5lines”:
1
|
hanson@linux-host:~$ nl passwd | sed '2,5c 2,5lines'
|
想要打印出5,10之间的数据呢?
1
|
hanson@linux-host:~$ nl passwd | sed '5,10p'
|
笨的方法是:
1
|
hanson@linux-host:~$ nl passwd | head -n 10 | tail -n 5
|
数据的替换
sed以行为单位进行数据的替换时,与vim相当类似,格式如下:
1
|
sed 's/要被替换的字符串/新的字符串/g'
|
下面一个实例,查询出本机的ip地址:
查看eth0:
1
2
3
4
5
6
|
hanson@linux-host:~$ ifconfig eth0
eth0 Link encap:以太网 硬件地址 08:9e:01:31:a4:8f
inet 地址:192.168.1.102 广播:192.168.1.255 掩码:255.255.255.0
inet6 地址: fe80::a9e:1ff:fe31:a48f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
...
|
开始查询:
1
2
|
hanson@linux-host:~$ ifconfig eth0 | grep 'inet 地址' | sed 's/^.*地址://g' | sed 's/广播.*$//g'
192.168.1.102
|
直接修改文件内容
sed可以直接进行文件的修改,而不用使用管道命令或者重定向,但这是一个危险操作,一定要注意:
1
2
3
|
hanson@linux-host:~$ sed -i '$a #this is a new line.' passwd
hanson@linux-host:~$ cat passwd | tail -n 1
#this is a new line.
|
sed 的”-i”参数可以直接修改文件的内容,这个功能非常有帮助,甚至不需要vim去修改。
更多关于sed使用讲解,请参考[左耳朵耗子]的sed简明教程
(end)