sed命令详解
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行
[root@shell-test 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行
[root@shell-test log]# sed -n '3p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
打印匹配root的行
[root@shell-test 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行
[root@shell-test 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之间的行 也可以打印时间范围
[root@shell-test 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}会打印行号
[root@shell-test 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
[root@shell-test 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
删除2,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次 |
\ | 精确匹配前面的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字重复出现一次到三次之间以上
sed编辑命令
参数 | 说明 |
---|---|
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 's@loop@lood@' /opt/test.txt 替换第一次出现的loop为lood
sed 's@loop@lood@2g' /opt/test.txt 替换前两行
sed 's@loop@lood@'g /opt/test.txt 替换所有loop为lood