打开高效文本编辑之门_Linux Sed模拟常见文件命令
Posted ShenLiang2025
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打开高效文本编辑之门_Linux Sed模拟常见文件命令相关的知识,希望对你有一定的参考价值。
Linux sed 实现grep cat wc tail命令的效果对比案例
声明与简介
sed:Stream Editor文本流编辑器,sed是一个“非交互式的”面向字符流的编辑器。本文以案例来介绍如何使用sed来达到其它linux文件命令的效果,或者说如何用sed来模拟其它命令。众所周知在linux环境下,我们会接触很多文件处理的命令,如grep、cat、head、tail、wc等,那么功能强大的文件流编辑器sed能否实现这些功能呢?阅读下文,逐个给大家来揭晓。
注: 1 至少有一台linux环境,当前验证环境是Centos 8。
2 了解常见的linux脚本的写法,能认识或者常用单词的缩写。
3 本文会根据实际实践更新和修正,欢迎批评、指导
数据说明
如下是使用的示例文本数据,这里的行号是为了方便解释结果,不是文本内容。
1 7369,smith,clerk,7902,'1980-12-17',800,null,20
2 7499,allen,salesman,7698,'1981-2-20',1600,300,30
3 7521,ward,salesman,7698,'1981-2-22',1250,500,30
4 7566,jones,manager,7839,'1981-4-2',2975,null,20
5 7654,martin,salesman,7698,'1981-9-28',1250,1400,30
6 7655,jack,manager,7698,'1987-3-28',1600,1800,10
7 7656,tim,clerk,7902,'1982-12-12',1400,1400,30
8 7657,kate,clerk,7902,'1989-11-11',1400,1800,10
9 7698,blake,manager,7839,'1981-5-1',2850,null,30
10 7699,dlake,salesman,7839,'1983-6-15',3000,null,10
11 7782,clark,manager,7839,'1981-1-9',2450,null,10
12 7788,scott,analyst,7566,'1982-12-9,3000,null,20
13 7839,king,president,null,'1981-11-17',5000,null,10
14 7844,turner,salesman,7698,'1981-12-8',1500,0,30
15 7876,adams,clerk,7788,'1983-1-12',1100,null,20
16 7900,james,clerk,7698,'1981-12-3',950,null,30
17
18 --7902,ford,analyst,7566,'1981-12-3',3000,null,20
19
20 7934,miller,clerk,7782,'1982-1-23',1300,null,10
cat命令
Linux的cat命令是对文件的读取,即可以查看文件的内容。这里sed可以通过p命令,结合-n来查看内容。
读取文本内容
# 查看文本emp.txt的内容。
sed -n 'p' emp.txt
# cat命令查看文件所有内容
cat emp.txt
# 结果(部分数据)
7369,smith,clerk,7902,'1980-12-17',800,null,20
7499,allen,salesman,7698,'1981-2-20',1600,300,30
7521,ward,salesman,7698,'1981-2-22',1250,500,30
7566,jones,manager,7839,'1981-4-2',2975,null,20
grep命令
Linux的grep命令是对文件的关键字匹配,即可以通过特定的关键字来匹配到指定的行。这里sed可以通过p命令”/、/”结合-n或者通过s命令匹配达到同样的效果。
关键字匹配
# 1 匹配emp.txt里含scott的行的内容。
grep scott emp.txt
#结果
7788,scott,analyst,7566,'1982-12-9',3000,null,20
# way1 通过p直接匹配关键字scott
sed -n '/scott/p' emp.txt
# 结果
7788,scott,analyst,7566,'1982-12-9',3000,null,20
# way2 通过p、s、$方式匹配关键字scott
sed -n 's/scott/$/p' emp.txt
# 结果
7788,$,analyst,7566,'1982-12-9',3000,null,20
#注:S这种方式需要加上$,意思为匹配到每行的结束。
反向关键字匹配
# 2匹配emp.txt里不含scott的行的内容。。
grep -v scott emp.txt
# 在sed里仅需要在正向匹配时的p命令前加个!(反向的意思)。
sed -n '/scott/!p' emp.txt
head命令
Linux的haed命令是对文件的排名靠前的行进行匹配,即可以通过指定行号N来查看前N行的内容。这里sed可以通过p命令首尾行号或者通过q命令或者d命令达到同样的效果。
显示文件前面N行
# 1只显示文件的前4行,通过head加行号4来达到目的。
head -4 emp.txt
# Sed方式实现可p(打印)、q(退出)、d(删除)命令来实现同样的效果
# Way1 通过结合p结合行首、尾来实现该效果。
sed -n '1,4 p' emp.txt
# 执行结果
7369,smith,clerk,7902,'1980-12-17',800,null,20
7499,allen,salesman,7698,'1981-2-20',1600,300,30
7521,ward,salesman,7698,'1981-2-22',1250,500,30
7566,jones,manager,7839,'1981-4-2',2975,null,20
# Way2 通过结合q结合行号来实现。
sed '4 q' emp.txt
# Way3 通过行号结合d来实现
sed '5,$ d' emp.txt
#注: 这里的行号是要保留的行加1,因为删除是从要保留的行的下一行开始。
tail命令
Linux的tail命令是对文件的排名靠后的行进行匹配,即可以通过指定行号N来从查看后N行的内容。这里sed可以通过p命令首尾行号或者通过q命令或者d命令达到同样的效果。
显示文件后面N行
# 通过tail命令,这里指定行数为5
tail -5 emp.txt
# Way1 sed通过p结合行范围,这里起始位置为总行数-要保留的行数+1,即20-5+1=16。
sed -n '16,$ p' emp.txt
7900,james,clerk,7698,'1981-12-3',950,null,30
--7902,ford,analyst,7566,'1981-12-3',3000,null,20
7934,miller,clerk,7782,'1982-1-23',1300,null,10
# Way 2 同理,我们也可以通过d命令实现类似的效果,注意这里的末尾是总行号-要保留的行号。即20-5=15。
sed '1,15 d' emp.txt
wc命令
wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。
显示文件总行数
# 提供wc命令查看文件行号
wc -l emp.txt
#结果
20 emp.txt
#不想显示文件名则通过cat文件再结合管道来实现
cat emp.txt | wc –l
#结果
20
#sed命令结合=、$也能达到查看文件总行号的效果
sed -n '$ =' emp.txt
# 结果
20
以上是关于打开高效文本编辑之门_Linux Sed模拟常见文件命令的主要内容,如果未能解决你的问题,请参考以下文章
打开高效文本编辑之门_Linux sed之模式空间与保留空间
打开高效文本编辑之门_Linux Sed插入追加转换退出等命令应用