Linux常用命令——sed
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux常用命令——sed相关的知识,希望对你有一定的参考价值。
sed 字符流编辑器
sed 是Stream Editor(字符流编辑器)的缩写,简称刘编辑器。
sed 是操作、过滤和转换文本内容的强大的工具。常用功能包括对文件实现快速增删改查,其中查询的功能中最常用的两大功能是过滤(过滤制定字符串)取行(取出指定行)
语法格式:sed【选项】【sed内置命令字符】【输入文件】
注意:
1.sed 以及后面的选项、命令和输出文件,每个元素之间都要至少要有一个空格
参数选项:
参数 | 说明 |
---|---|
-i | 直接修改文件内容 |
-n | 静默模式,仅打印和sed命令匹配的内容 |
-r | 支持扩展表达式(预设是基础正规表示法语法) |
-e | 直接在命令行模式上进行sed动作编辑,此为默认选项 |
-f | 将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作 |
-V | -V或--version 显示版本信息 |
动作参数说明:
参数 | 简述 | 详情 |
---|---|---|
a | 新增 | 在当前行下面插入文本 |
c | 取代 | 把选定的行改为新的文本 |
i | 插入 | 在当前行上面插入文本 |
d | 删除 | 删除选择的行 |
p | 打印 | 打印模板块的行,通常 p 会与参数 sed -n 一起运行 |
s | 取代 | 替换指定字符,例如 1,20 s/old/new/g |
g | 替换 | 表示行内全面替换 |
y | 更新 | 表示把一个字符翻译为另外的字符(但是不用于正则表达式) |
r | 文件 | 从目标文件中读取 |
sed 元字符集
字符集 | 说明 | 案例 |
---|---|---|
^ | 锚定行的开始 | 如:‘^grep‘ 匹配所有以 grep 开头的行 |
$ | 锚定行的结束 | 如:‘grep$‘ 匹配所有以 grep 结尾的行 |
. | 匹配一个非换行符的字符 | 如:‘gr.p‘ 匹配 gr 后接一个任意字符,然后是 p |
* | 匹配零个或多个先前字符 | 如:‘ *grep‘ 匹配所有一个或多个空格后紧跟 grep 的行。 .* 一起用代表任意字符 |
[ ] | 匹配一个指定范围内的字符 | 如:‘[Gg]rep‘ 匹配 Grep 和 grep |
[^ ] | 匹配一个不在指定范围内的字符 | 如:‘[^A-FH-Z]rep‘ 匹配不包含 A-F 和 H-Z 的一个字母开头,紧跟 rep 的行 |
(..) | 标记匹配字符 | 如:‘(love)‘,love 被标记为1 |
& | 保存搜索字符用来替换其他字符 | 如s/love/&/,love这成love |
< | 锚定单词的开始 | 如:‘<grep‘ 匹配包含以grep开头的单词的行 |
> | 锚定单词的结束 | 如:‘grep>‘ 匹配包含以grep结尾的单词的行 |
x{m} | 连续重复字符 x,m 次 | 如:‘o{5}‘ 匹配包含连续5个o的行 |
x{m,} | 连续重复字符 x,至少 m 次 | 如:‘o{5,}‘ 匹配至少连续有5个 o 的行 |
x{m,n} | 连续重复字符 x,至少 m 次,不多于 n 次 | 如:‘o{5,10}‘ 匹配连续 5-10 个 o 的行 |
[:digit:] | 所有数字, 相当于0-9 | 如:[0-9]---> [[:digit:]] |
[:lower:] | 所有的小写字母 | 如:[a-z]---> [[:lower:]] |
[:upper:] | 所有的大写字母 | 如:[A-Z]---> [[:upper:]] |
[:alpha:] | 所有的字母 | 如:[A-Za-z]---> [[:alpha:]] |
[:alnum:] | 非特殊符号,相当于0-9a-zA-Z | 如:[0-9a-zA-Z]---> [[:alnum:]] |
[:space:] | 空白字符 | 如:[ ]---> [[:space:]] |
[:punct:] | 所有标点符号 | 如:[^0-9a-zA-Z]---> [[:punct:]] |
注意:扩展正则表达式必须结合 -r 选项
常用:命令 sed 替换用法举例
源文件
示例:
序号 | 指令 | 说明 |
---|---|---|
① | sed -i ‘/news/c HAPPY‘ bak.txt | 匹配 news 字符的行,替换成 HAPPY 的行 |
② | sed -i ‘s#static#stop#‘ bak.txt | 把 static 字符替换成 stop 字符 |
③ | sed -i ‘/server/s#68.1#76.3#‘ bak.txt | 匹配 server 的字符行,把 68.1 替换成 76.3 由于点号有特殊意义所有需要转义 |
④ | sed -i ‘s#lp#LP#2g‘ bak.txt | 把所有匹配到 的行中第二次及以后出现的 on 字符替换成 ysg 字符 |
⑤ | sed -i ‘s#root#tom#2p‘ bak.txt | 把所有匹配到字符 bin 的行中第二次出现的 root 替换成 tom 字符,并再生产与匹配行同样的行 |
⑥ | sed -i ‘s#games#GAMES#2‘ bak.txt | 把所有匹配到字符 usr 的行,第三次出现的 usr 替换成 USR 字符 |
⑦ | sed -i ‘/sys/{s#/dev#/log#;s#3#6#g}‘ bak.txt | 匹配字符 sys 的行,把字符 dev 替换成 log 字符,且把 3 替换成 6 |
⑧ | sed -i ‘s#nologin#(&)#g‘ bak.txt | 把 nologin 用括号括起来,& 表示引用前面匹配的字符 |
⑨ | sed -i ‘s/sys:x/#&/g‘ bak.txt | 匹配字符 sys:x 的行前面添加 # 号 |
⑩ | sed -i ‘/tcp/s#;# #g‘ bak.txt | 匹配字符 tcp 的行,把分号替换成空,也可用于去注释 # 号 |
改变后的
常用:命令 sed 简单变量举例
引用变量
注意:当sed命令也有默认变量时,在去引用自己定义的变量会出现语法错误
注意:当sed命令里面没有默认的变量时可以把单引号改成双引号当sed命令里面有默认的变量时,那自己定义的变量需要加单引号,且sed里面的语句必须用单引
进阶:命令 sed 的高级使用
案例一
正在操作的内容行写入到文件中
指定行号添加内容
案例二
获取域名信息
源文件与结果样式
cat yuming.txt|sed ‘s#http://##;s#/.*##‘|sort|uniq -c|sort -rn
awk -F/ ‘{print $3}‘ yuming.txt|sort -r|uniq -c|awk ‘{print $1" ",$2}‘
命令参数用法举例
案例一
参数 -n 举例
注意:在不加 -n 时,检索到的行重复打印两遍,原因是 sed 默认会打印文件中的所有行
注意:当使用多个 sed 编辑命令时,需用 {} 并用分号进行分隔
案例二
动作参数 -s 举例
在匹配的行尾添加 book 字符
在 is 字符前添加 ysg
动作参数 -i 举例
动作参数 -a 举例
动作参数 -d 举例
注意:在不适用 -i 参数时,原文本不会被修改,当使用 -i 参数时表示写入并修改文本,参数 -e 表示直接在命令行模式上进行sed动作编辑,此为默认选项
案例三
sed 的正则表达式举例
举例 | 说明 |
---|---|
sed ‘5 q‘ /etc/passwd | 打印前 5 行 |
sed -n ‘1,3p‘ /etc/passwd | 打印 1-3 行 |
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 -n ‘/^#/!p‘ /etc/vsftpd/vsftpd.conf | 打印以 # 开头的行,进行取反,已达到过滤注释的效果 |
sed -n ‘/^#/!{/^$/!p}‘ /etc/vsftpd/vsftpd.conf | 匹配以 # 开头的行,进行取反,然后在其结果中对空格开头的行进行取反,表示过滤空格与注释 |
sed -e ‘/^#/d‘ -e ‘/^$/d‘ /etc/vsftpd/vsftpd.conf | 删除匹配的空格行与 # 号开头的行,sed支持对单个文件进行多条件操作 |
以上是关于Linux常用命令——sed的主要内容,如果未能解决你的问题,请参考以下文章