string editor 流编辑器
sed编辑器是一行一行的处理内容,正在处理的内容存放在缓冲区内,处理完后
按照选项的规定进行输出或者修改文件
option: | |
-n | 静默模式结合p可以只输出修改行,读取指定行数 |
-e | 多操作指令 |
-f | 运行脚本 |
-i | 修改文件 |
-i.bak | 修改同时备份.bak文件 |
-r | 使用扩展正则 |
command: | |
a | 追加 |
i | 插入 |
p | 打印 |
d | 删除 |
r/R | 读取文件/一行 |
w | 存档 |
s | 查找 |
c | 替换 |
y | 替换 |
h/H | 复制拷贝/追加缓冲区到存放空间 |
g/G | 粘贴 从存放空间取回/追加到模式空间 |
x | 两个空间内容交换 |
n/N | 拷贝/追加下一行内容到当前 |
D | 删除\n之前的内容 |
P | 打印\n之前的内容 |
b | 无条件跳转 |
t | 满足匹配后的跳转 |
T | 不满足匹配时的跳转 |
常用用法:
sed 's/root/rooot/g' /etc/passwd #将root替换成rooot,并标准输出 sed 's/root/rooot/g' /etc/passwd > /etc/passwd #将替换结果作为文件修改(谨慎使用,注意备份) sed -i 's/root/rooot/g' /etc/passwd #将替换结果作为文件修改
输出第三行
sed -n '3p' /etc/passwd
-n抑制输出,如果不加上p打印的话,修改行是不会输出显示出来的
输出前三行
sed -n '1,3p' /etc/passwd
head -3 /etc/passwd
输出第一行和第三行
nl /etc/passwd | sed -n -e "1p" -e "3p"
输出前三行之外的行
sed -n '1,3!p'
注意使用单引号,防止!p转义
输出第三行及其之后的三行
nl passwd | sed -n '3,+3p'
将文本每行最后七个字符换成!号
sed -n 's#.\{7\}$#!#p' ooo
在文本的每一行前添加#符号,此时不要开启静默模式-n
sed 's/^.\?/#&/' passwd
& 替代符 替代前面所匹配的
? 数量符 需要转义 表示1个或0个
/ 分隔符 此处三个都是 可以用别的符号代替,避免冲突,下面是一个斜线冲突避免的例子
sed 's_/bin/bash_/sbin/nologin_' /etc/passwd
将某个目录下所有文件文本中的kkkkk 换成 ddddd
sed -i 's/kkkkk/ddddd/g' `grep kkkkk -rl mydir`
grep 中 -r递归几层
截取文本中的某一段(IP地址)并存放与文件中
cat eth0 | sed 's/.*t addr://' | sed 's/ Bc.*//' |xargs echo > ech0 sed -i -e 's/.*t addr://' -e sed 's/B.*//' eth0
.* 表示任意字母任意数量
-e 表示多点编辑
-i 表示修改文件
删除第6行到最后一行
sed '6,$d' file
删除第1行 和 第3行
sed -e '1d' -e '3d' file
第3行上面插入两行
sed '3i hello world \ >the text' file
第4行下追加一行
sed "4a Hello world" passwd
替换行
sed '3c33333333' file #替换第三行
保存apache配置文件中的非注释行
sed -n '/^[^#]/w apache.conf' /etc/apache2/apache2.conf
对字符操作
把file中的包含root的行删除
sed '/root/d' file
显示包含某些字符的行
sed -n '/root/n' file
检索行并于此执行命令 命令间分好隔开
sed -n '/root/{s/bash/bullet;p;q}' file #将含有root的行上把bash改成bullet并输出
s替换 p打印 q退出
Grep的正则匹配
匹配空行
grep -n ^$ file
匹配非空行
grep -n -v ^$ file
匹配单引号
grep \' /etc/services --color grep "'" /etc/services --color
模糊匹配,星号表示前一个字母零个或多个
grep -n spo* /etc/passwd --color
匹配ga或者ge
grep g[ae] /etc/passwd --color
匹配非注释行
grep -v \# /etc/apache2/apache2.conf grep ^[^#] /etc/apache2/apache2.conf --color
注意上面两个语句都可以匹配非注释行,但第一个语句绘保留空行,第二个不会
字符数量匹配
grep -n "o\{2,3\}" /etc/passwd
注意转义需要引号
单词精确匹配
grep "\<spool\>" /etc/passwd --color
最后的小插曲
cat -n 与 nl 的区别,实践出真知!