linux命令总结:sed

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

说明:

sed用于过滤和转换文本的流编辑器

可以采用正则匹配,对文本进行插入删除修改等操作

Sed处理的时候,一次处理一行,每一次把当前处理的存放在临时缓冲区,处理完后输出缓冲区内容到屏幕,然后把下一行读入缓冲区,如此重复,直到处理完最后一行。


用法:

sed [OPTION] ... {script-only-if-no-other-script} [input-file] ...

sed [选项] ... [动作] [文件]

参数:

-n 安静模式,取消默认输出
-e 直接在命令列上进行sed动作编辑
-f 读取脚本文件内sed命令处理文件
-r sed动作支持延伸的正则表达(默认只是基础正则)
-i 直接修改文件内容(实验时慎用系统文件)

-u 从输入文件加载少量的数据并刷新更多的输出缓冲区

--help 显示帮助信息并退出

--version  输出版本信息并退出


命令:

:label     是b和t命令的标签,用来实现跳转处理,名字可以随便取(label)

=     打印当前行号码

a\    追加,在当前行的下一行追加文本

i\    插入,在当前行的上一行插入文本

q    退出,与Q一样

b label    分行到标签,如果标签被省略,则分支到脚本的末尾。

t label    如果从上一次做了一个成功的替代,输入行被读取,并且从最后一个t或T命令,然后分支到标签,如果省略则分支到末尾。

T label    如果没有s///从上一次成功替换输入行被读取,并且从最后一个t或T命令,然后分支到标签。如果省略则分支到末尾。

c \    用所有嵌入的文本替换所选行,换行符前面加反斜杠。

d    删除选择的行

D    删除模版快的第一行

h H    复制或追加模版块的内容到缓冲区

g G    获取内存缓存区的内容,并替换或追加到当前模版块文本

x    交换保留和模式空间的内容

l    以视觉上明确的形式列出当前行

n N  将下一行输入读取或附加到模式空间中

p    打印当前模版块的行

P    打印莫板块的第一行

s/// 替换匹配字符,可以使用正则

w    将当前模式空间写入文件

W    将当前模式空间的第一行写入文件

!   表示后面的命令对所有没有被选定的行发生作用 

#    把注释扩展到下一个换行符以前

sed替换标记

g   表示行内全面替换 
p   表示打印行 
w   表示把行写入一个文件 
x   表示交换莫板块中的文本和缓冲区中的文本 
y   表示把一个字符翻译成另外的字符 
\1  子串匹配标记 

&   已匹配字符串标记

sed 元字符集 :
^     匹配行开始

$   匹配行结束 

.   匹配一个非换行符的任意字符

*   匹配0个或多个字符匹配所有模块是一个或多个空格后紧跟sed的行 

[]  匹配一个指定范围内的字符 

[^] 匹配一个不再指定范围内的字符 

\(..\) 匹配子串,保存匹配的字符,如 s/\(love\)able/\1rs loveable被替换成lovers 

&    保存搜索字符用来替换其他字符,如s/love/**&**/ love这成**love** 

\<   匹配单词的开始,如 /\<love/匹配包含以love开头的单词行 

\>   匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行 

x\{m\}   重复字符x,m次,如 /0{5\}/匹配包含5个0的行 

x\{m,\}  重复字符x,至少m次,如 /0\{5,\}/匹配至少有5个0的行 

x\{m,n\} 重复字符x ,至少m次,不多于n次,如 /0\{5,10\}/匹配5~10个0的行


实例:

替换操作 :s命令 

替换文本中的字符串

1
2
3
[root@zxq ~] # sed 's/aa/99/' aa.txt 
99  123  345 aa bb cc  dd  bb ee
bb 123 333 444 333 222 bb

-n 选项和p选项一起使用表示只打印发生变化的行

1
2
[root@zxq ~] # sed -n 's/aa/www.baidu.com/p' aa.txt 
www.baidu.com  123  345 aa bb cc  dd  bb ee

直接编辑文件选项-i,会匹配文件中每一行匹配的内容

1
2
3
4
[root@zxq ~] #sed -i 's/aa/888/g' aa.txt   #全面替换标记g
[root@zxq ~] # cat aa.txt 
888  123  345 888 bb cc  dd  bb ee
bb 123 333 444 333 222 bb

当需要从第N出匹配开始替换时,可以使用/Ng:

1
2
3
4
5
6
7
8
[root@zxq ~] # echo ababababababab | sed 's/ab/AB/2g'
abABABABABABAB
[root@zxq ~] # echo ababababababab | sed 's/ab/AB/3g'
ababABABABABAB
[root@zxq ~] # echo ababababababab | sed 's/ab/AB/4g'
abababABABABAB
[root@zxq ~] # echo ababababababab | sed 's/ab/AB/5g'
ababababABABAB

以上命令中/在sed中作为定界符使用,也可以使用任意的定界符,例如使用#号将输出内容转换成大写,其中的U在元字符里是大写大意思,&代表已匹配的字符。

1
2
[root@zxq ~] # echo abcd |sed 's#[a-z]#\U&#g'
ABCD

删除操作:d命令 

1
2
3
4
5
6
7
8
9
10
删除空白行
sed  '/^$/d'  file
删除文件的第2行
sed  '2d'  file
删除文件的第2行到末尾所有行
sed  '2,$d'  file
删除文件最后一行
sed  '$d'  file11
删除文件中所有开头的 test 的行
sed  '/^test/d'  file

已匹配字符串标记& 
正则表达式\w+匹配每一个单词,使用[&]替换它,&对于之前所匹配到的单词

1
2
[root@zxq ~] # echo a b c d |sed 's/\w\+/[&]/g'
[a] [b] [c] [d]

&代表前面匹配的内容然后加上后面需要替换的内容:

1
2
[root@zxq ~] # echo "202.106.0.20"|sed 's/202.106.0.20/&DNS/g'
202.106.0.20DNS

子串匹配标记 \1 
匹配给定样式的其中一部分,第一个使用\1第二个使用\2,下面是截取IP和mac地址

1
2
[root@zxq ~] # ifconfig eth0|sed -n 's/^.*addr:\(.*\)  .*  Mask:\(.*\)$/ip:\1 mac:\2/gp'
ip:10.0.0.4 mac:255.255.255.0

命令中第一个()内的内容匹配\1,第二个()内大内容匹配\2,依此类推 
例如:[a-z]+代表任意字符后面的+是多个的意思,此处使用-r选项使用延伸的正则表达式,就不需要对特殊字符转义了。

1
2
[root@zxq ~] # echo "aaa BBB"|sed -r 's/([a-z]+) ([A-Z]+)/\2 \1/'
BBB aaa

引用 
sed表达式可以使用单引号来引用,但是如果表达式内部包含变量字符串,就需要使用双引号

1
2
3
4
[root@zxq ~] # aa=mysql;echo "this is sqlserver"|sed 's/sqlserver/$aa/'
this is $aa
[root@zxq ~] # aa=mysql;echo "this is sqlserver"|sed "s/sqlserver/$aa/"
this is mysql

选定行的范围: ,逗号 
所有在模板bbb和ddd所确定的范围内的行都被打印

1
2
3
4
[root@zxq ~] # echo -e "aaa\nbbb\nccc\nddd"|sed -n '/bbb/,/ddd/p'
bbb
ccc
ddd

打印从第2行开始到第一个包含以ccc开始的行之间的所有行包括ccc:

1
2
3
[root@zxq ~] # echo -e "aaa\nbbb\nccc\nddd"|sed -n '2,/^ccc/p'
bbb
ccc

对于aaa和ccc之间的行,每行的末尾追加www.com

1
2
3
4
5
[root@zxq ~] # echo -e "aaa\nbbb\nccc\nddd"|sed '/aaa/,/ccc/s/$/www.com/'
aaawww.com
bbbwww.com
cccwww.com
ddd

多点编辑:e 命令

1
2
3
[root@zxq ~] # echo -e "aaa\nbbb\nccc\nddd\neee"|sed -e '1,3d' -e 's/eee/www/'
ddd
www

上面sed表达式的第一条命令删除1至3行,第二条命令用eee替换www,命令的执行顺序对结果有影响,如果两个 命令都是替换命令,那么第一个命令将 影响第二个替换命令的结果

和-e等价的命令是–expression

1
2
3
4
5
6
[root@zxq ~] # echo -e "aaa\nbbb\nccc\nddd\neee"|sed --expression 's/aaa/MMM/' --expression 's/eee/www/'
MMM
bbb
ccc
ddd
www

从文件读入: r命令 
file里面的内容被读进来,显示在与aaa匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的后面sed '/aaa/r filename

1
2
3
4
5
6
7
8
9
10
[root@zxq ~] # echo -e "aaa\nbbb\naaa\nddd\neee"|sed '/aaa/r aa.txt'
aaa
www.org
blog.com
bbb
aaa
www.org
blog.com
ddd
eee

从文件写入:w命令

将匹配的行写入到文件内,注意会覆盖原文件内容

1
2
3
4
[root@zxq ~] # echo -e "aaa\nbbb\naaa\nddd\neee"|sed -n '/aaa/w aa.txt'
[root@zxq ~] # cat aa.txt 
aaa
aaa

追加: a\ 命令 
将www.gun.org追加到以aaa开头的行后面 

1
2
3
4
5
6
7
8
[root@zxq ~] # echo -e "aaa\nbbb\naaa\nddd\neee"|sed '/^aaa/a\www.gun.org'
aaa
www.gun.org
bbb
aaa
www.gun.org
ddd
eee

在文件第2行之后追加www,centos.org 

1
2
3
4
5
[root@zxq ~] # sed -i '2a\www.centos.org' aa.txt 
[root@zxq ~] # cat aa.txt 
aaa
aaa
www.centos.org

插入: i\ 命令

在匹配的行前面插入内容

1
2
3
4
5
6
7
8
[root@zxq ~] # echo -e "aaa\nbbb\naaa\nddd\neee"|sed '/^aaa/i\www.gun.org'
www.gun.org
aaa
bbb
www.gun.org
aaa
ddd
eee

下一个 n/N 命令 
:label将存储一个标签位置,使用N追加下一行文本到此空间,此处就有了两行文本(aa$bb),然后使用s/\n//p替换功能替换换行符(\n),输出aabb,b将跳转标签位为bb后,赋值给label。然后逐行执行语句到行尾。

1
2
3
4
5
6
7
8
[root@pjy ~] # cat a.txt 
aa
bb
cc
[root@pjy ~] # sed ':label;N;s/\n//p;b label' a.txt 
aabb
aabbcc
aabbcc

变形: y命令 
把1~10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令 

1
2
3
4
5
6
[root@zxq ~] # echo -e "aaa\nbbb\naaa\nddd\neee"|sed '1,4y/abcde/ABCDE/'
AAA
BBB
AAA
DDD
eee

退出 q命令 
打印完第10行后,退出sed

sed '10q' file

打印奇数行或偶数行

方法1,使用n命令下一行打印

1
2
3
4
5
6
7
8
9
打印奇数行:
[root@zxq ~] # echo -e "aaa\nbbb\naaa\nddd\neee"|sed -n 'p;n'
aaa
aaa
eee
打印偶数行:
[root@zxq ~] # echo -e "aaa\nbbb\naaa\nddd\neee"|sed -n 'n;p'
bbb
ddd

方法2,指定从第几行开始打印,后面数字指定间隔几行打印

1
2
3
4
5
6
7
[root@zxq ~] # echo -e "aaa\nbbb\naaa\nddd\neee"|sed -n '1~2p'
aaa
aaa
eee
[root@zxq ~] # echo -e "aaa\nbbb\naaa\nddd\neee"|sed -n '2~2p'
bbb
ddd

打印匹配字符串的下一行

1
2
[root@zxq ~] # echo -e "aaa\nbbb\naaa\nddd\neee"|sed -n '/ddd/{n;p}'
eee

使用b做跳转,当判断字符为aaa时b就跳转到x,此处的:x为定义的标签,标签后为执行的动作。匹配字符aa就跳转到x执行动作,在aa后面添加制表符和YES,如果不为aa就不跳转直接执行后面的s/$/\tYES/,在后面添加制表符和YES。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@zxq ~] # echo -e "aaa\nbbb\naaa\nddd\neee"|sed '/^aaa/bx;s/$/\tNO/;b;:x;s/$/\tYES/'
aaaYES
bbbNO
aaaYES
dddNO
eeeNO
使用t做跳转时,如果有一次成功的替换则读入最后一个T或t命令,此处还是不太明白,有懂的大神希望留言告知。
[root@zxq ~] # echo -e "aaa\nbbb\naaa\nddd\neee"|sed '/^aaa/tx;s/$/\tNO/;t;:x;s/$/\tYES/'
aaaNO
bbbNO
aaaNO
dddNO
eeeNO
使用T做跳转时,如果有一次成功的替换则读入最后一个T或t命令,使用取反跳转,此处还是不太明白,有懂的大神希望留言告知。
[root@zxq ~] # echo -e "aaa\nbbb\naaa\nddd\neee"|sed '/^aaa/Tx;s/$/\tNO/;T;:x;s/$/\tYES/'
aaaYES
bbbNOYES
aaaYES
dddNOYES
eeeNOYES

分析多行日志取IP和mac地址并做统计实例:

1
2
grep  -wE  '^lease|hardware'  $patha /dhcpd .leases| sed  ':x;N;s/{\n//;b x' | sed  -n  "s/;$//gp" | awk  'BEGIN{print "IP""\t\t""MAC"} {print $2"\t"$5}'  >$patha /ip_table .txt
cat  $patha /ip_table .txt |  wc  -l > $patha /aa .txt

后期补充。。。。


本文转自 80后小菜鸟 51CTO博客,原文链接:http://blog.51cto.com/zhangxinqi/1921804


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
4天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
22 3
|
4天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
17 2
|
4天前
|
安全 网络协议 Linux
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。通过掌握 ping 命令,读者可以轻松测试网络连通性、诊断网络问题并提升网络管理能力。
22 3
|
7天前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
33 6
|
8天前
|
监控 Linux 开发者
如何在 Linux 中优雅的使用 head 命令,用来看日志简直溜的不行
`head` 命令是 Linux 系统中一个非常实用的工具,用于快速查看文件的开头部分内容。本文介绍了 `head` 命令的基本用法、高级用法、实际应用案例及注意事项,帮助用户高效处理文件和日志,提升工作效率。
21 7
|
10天前
|
监控 Linux
Linux常用命令-2
本文继续介绍Linux常用命令,涵盖目录操作、文件操作、系统信息和进程管理等类别。具体包括mkdir、rmdir、cp、mv、rm、touch、whereis、whatis、dmesg、free、date、cal、ps、kill、killall和top等命令的使用方法和常用参数。
39 7
|
8天前
|
监控 Linux Perl
Linux 命令小技巧:显示文件指定行的内容
在 Linux 系统中,处理文本文件是一项常见任务。本文介绍了如何使用 head、tail、sed 和 awk 等命令快速显示文件中的指定行内容,帮助你高效处理文本文件。通过实际应用场景和案例分析,展示了这些命令在代码审查、日志分析和文本处理中的具体用途。同时,还提供了注意事项和技巧,帮助你更好地掌握这些命令。
22 4
|
7天前
|
缓存 网络协议 Linux
Linux ip命令常用操作
Linux的 `ip`命令是一个强大且灵活的网络管理工具,能够执行从基本的网络接口配置到高级的路由和VLAN管理等多种操作。通过熟练掌握这些常用操作,用户可以更加高效地管理和配置Linux系统的网络环境。无论是在日常管理还是故障排除中,`ip`命令都是必不可少的工具。
11 2
|
8天前
|
缓存 运维 监控
【运维必备知识】Linux系统平均负载与top、uptime命令详解
系统平均负载是衡量Linux服务器性能的关键指标之一。通过使用 `top`和 `uptime`命令,可以实时监控系统的负载情况,帮助运维人员及时发现并解决潜在问题。理解这些工具的输出和意义是确保系统稳定运行的基础。希望本文对Linux系统平均负载及相关命令的详细解析能帮助您更好地进行系统运维和性能优化。
26 3
|
10天前
|
Linux Shell
Linux常用命令-1
本课程要求学生熟悉Linux系统终端窗口和命令基础,掌握文件目录类、系统信息类、进程管理类及其他常用命令,学时为3-6小时。课程内容涵盖Linux命令的特点、常见命令的使用方法及其应用场景,如文件浏览、目录切换、内容显示等。建议学生逐个操作命令并及时反馈问题。
39 5