sed
Linux sed 命令是利用脚本来处理文本文件。
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
语法
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
选项说明:
- -i[SUFFIX], —in-place[=SUFFIX] 以脚本处理并写入文件
- -e script, —expression=script 以脚本处理后输出
- -f script-file, —file=script-file 以脚本文件内容操作文件
- -n, —quiet, —silent 只输出匹配到的行
- —help 帮助
- —version 版本
动作说明:
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
- s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
示例
以下示例以此文件为原始文件:
$ cat > a <<EOF
> 1
> 2
> 3
> 4
> 5
> EOF
$ cat a
1
2
3
4
5
列出文件内容
仅列出目标文件2-3行内容
$ sed -n '2,3p' a
2
3
仅输出
使用 -e
选项 仅输出修改后的内容, 不改变文件内容本身
$ sed -e '4a\newLine' a
1
2
3
4
newLine
5
$ cat a
1
2
3
4
5
:::warning sed 后面接的动作,请务必以 ‘’ 两个单引号括住喔 :::
修改内容
通过 -i
选项可以直接对文件进行修改
在第4行下面添加新行
sed -i '4a\newLine' a
$ cat a
1
2
3
4
newLine
5
或者
sed -i '4a newLine' a
如果是在某行前面添加新行:
sed -i '2i newLine' a
在文件末尾添加新行:
sed -i '$a lastline' a
其中 $
代表最后一行
添加多行
每一行末尾都可以使用 \
来连接新行
$ nl a | sed '2a newLine1 ......\
> newLine2'
1 1
2 2
newLine1 ......
newLine2
3 3
4 4
5 5
以脚本文件内容编辑文件内容
使用 -f
选项可以使用某个文件的内容对目标文件进行处理
新建一个文件 b 并输入 4a\newLine
sed -i -f b a
效果跟执行 sed -i 4a\newLine a
一样
删除文件内容
$ nl a | sed '2,3d'
1 1
4 4
5 5
sed 的动作为 ‘2,3d’ ,那个 d 就是删除!因为 2-3 行给他删除了,所以显示的数据就没有 2-3 行
:::warning 原本应该是要下达 sed -e 才对,没有 -e 也行 :::
类似的操作:
# 只删除第 2 行
sed '2d' a
# 删除第 3 到最后一行
sed '3,$d' a
一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
1 root:x:0:0:root:/root:/bin/blueshell
2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
替换文件内容
将2-3行内容替换为指定内容:
$ sed '2,3c No 2-3 number' a
1
No 2-3 number
4
5
搜索内容
数据的搜寻并显示
搜索 /etc/passwd
中包含字符串 root
的行
$ nl /etc/passwd | sed -n '/root/p'
1 root:x:0:0:root:/root:/bin/bash
10 operator:x:11:0:operator:/root:/sbin/nologin
23 dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin
使用 p
进行打印内容, 前面是要是搜索内容的正则表达式
数据的搜寻并执行命令
搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:
$ nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p;q}'
1 root:x:0:0:root:/root:/bin/blueshell
数据的搜寻并删除
删除/etc/passwd所有包含root的行,其他行输出
nl /etc/passwd | sed '/root/d'
数据的搜寻并替换
除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!
sed 's/要被取代的字串/新的字串/g'
先观察原始信息,利用 /sbin/ifconfig 查询 IP
$ /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
本机的ip是192.168.1.100。
将 IP 前面的部分予以删除
$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
接下来则是删除后续的部分,亦即:Bcast:192.168.1.255 Mask:255.255.255.0
将 IP 后面的部分予以删除
$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
192.168.1.100
awk
AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。