sed
命令的选项(option):
-n
:只打印模式匹配的行
-e
:直接在命令行模式上进行sed动作编辑,此为默认选项
-f
:将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作
-r
:支持扩展表达式
-i
:直接修改文件内容
sed -n 'p' 打印行数 p前面定义行数 '1,3p'打印1到3行 '3p'打印3行 '/匹配项/p' 打印匹配字串
打印1到3行
[[email protected] log]# sed -n '1,3p' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
打印第3行
[[email protected] log]# sed -n '3p' /etc/passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin
打印匹配root的行
[[email protected] log]# sed -n '/root/p' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
打印匹配字串root行到第4行
[[email protected] log]# sed -n '/root/,4p' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin
打印两个匹配字串例如root和loo之间的行 也可以打印时间范围
[[email protected] log]# sed -n '/root/,/loop/p' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin .... yyx:x:1000:1000::/home/yyx:/bin/bash loop:x:1001:1001::/home/loop:/bin/bash
打印取反,匹配字串行取反 {=;p}会打印行号
[[email protected] log]# sed -n '1,5!{=;p}' /etc/passwd 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt
[[email protected] log]# sed -n '1,5!p' /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
删除1,5行
sed '2,5d' datafile
删除匹配字串到第二次匹配字串的行
sed '/loot/,/loop/d /etc/passwd'
删除匹配字串到第十行
sed '/loop/,10d' /opt/test.txt
正则表达式 | 说明 |
---|---|
^ | 锚点行首的符合条件的内容,用法格式"^pattern" |
$ | 锚点行首的符合条件的内容,用法格式"pattern$" |
^$ | 空白行 |
. | 匹配任意单个字符 |
* | 匹配紧挨在前面的字符任意次(0,1,多次) |
.* | 匹配任意长度的任意字符 |
\? | 匹配紧挨在前面的字符0次或1次 |
\{m,n\} | 匹配其前面的字符至少m次,至多n次 |
\{m,\} | 匹配其前面的字符至少m次 |
\{m\} | 精确匹配前面的m次{0,n}:0到n次 |
\< | 锚点词首相当于 \b,用法格式:<pattern |
\> | 锚点词尾,用法格式:>pattern |
\<pattern\> | 单词锚点 |
\(..\) | 分组,用法格式:\(pattern\),引用\1,\2 |
[] | 匹配指定范围内的任意单个字符 |
[^] | 匹配指定范围外的任意单个字符 |
[:digit:] | 所有数字, 相当于0-9, [0-9]---> [[:digit:]] |
[:lower:] | 所有的小写字母 |
[:upper:] | 所有的大写字母 |
[:alpha:] | 所有的字母 |
[:alnum:] | 相当于0-9a-zA-Z |
[:space:] | 空白字符 |
[:punct:] | 所有标点符号 |
sed -n '/r*t/p'/etc/passwd#打印匹配r有0个或者多个,后接一个t字符的行 sed -n '/.r.*/p'/etc/passwd#打印匹配有r的行并且r后面跟任意字符 sed -n '/o*/p'/etc/passwd#打印o字符重复任意次 sed -n '/o\{1,\}/p'/etc/passwd#打印o字重复出现一次以上 sed -n '/o\{1,3\}/p'/etc/passwd#打印o字重复出现一次到三次之间以上
参数 | 说明 |
---|---|
p | 打印匹配行(和-n选项一起合用) |
= | 显示文件行号 |
a|在定位行号后附加新文本信息 | |
i\ | 在定位行号后插入新文本信息 |
d | 删除定位行 |
c\ | 用新文本替换定位文本 |
w filename | 写文本到一个文件,类似输出重定向 > |
r filename | 从另一个文件中读文本,类似输入重定向 < |
s | 使用替换模式替换相应模式 |
q | 第一个模式匹配完成后退出或立即退出 |
l | 显示与八进制ACSII代码等价的控制符 |
{} | 在定位行执行的命令组,用分号隔开 |
n | 从另一个文件中读文本下一行,并从下一条命令而不是第一条命令开始对其的处理 |
N | 在数据流中添加下一行以创建用于处理的多行组 |
g | 将模式2粘贴到/pattern n/ |
y | 传送字符,替换单个字符 |
sed -n '/^#/!p' /etc/nginx/conf/nginx.conf 表示取不是#号的行 sed -n '/^#/!{/^$/!p}' /etc/nginx/conf/nginx.conf 表示取不是#号开头和空行的行 sed -e '/^#/d' -e '/^$/d' /etc/nginx/conf/nginx.conf 表示删除#号开头的行和空行 -e 是执行多重任务 sed -n '1,/loop/p' /etc/passwd 打印第一行到loop行 sed -n '/loop/,4p' /etc/passwd 打印loop到第四行 sed -i '1 i/lool/' /opt/test.txt sed '[email protected]@[email protected]' /opt/test.txt 替换第一次出现的loop为lood sed '[email protected]@[email protected]' /opt/test.txt 替换前两行 sed '[email protected]@[email protected]'g /opt/test.txt 替换所有loop为lood