打开高效文本编辑之门_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

 

你可能感兴趣的:(#,Shell脚本,grep,shell,linux,容器)