Linux sed 打印模式空间p命令使用案例
Posted ShenLiang2025
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux sed 打印模式空间p命令使用案例相关的知识,希望对你有一定的参考价值。
Linux sed p命令使用案例
声明与简介
sed:Stream Editor文本流编辑,sed是一个“非交互式的”面向字符流的编辑器。
本文主要以实际的数据来介绍sed的print pattern space(打印模式空间)即p命令的使用。
数据说明
数据参考至SQL案例_0_员工表数据集。这里用的是员工表emp,结构为(员工号、员工的姓名、岗位、领导编号、雇佣日期、工资、奖金、部门编号)。当前该数据保持在emp.txt内。
# 如下是使用的示例文本数据,这里的行号是为了方便解释结果,不是数据内容。
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
p命令
P命令即是print pattern space(打印模式空间),它是一块活动缓冲区,在sed编辑器执行命令时,它会保存sed编辑器要检验的文本。
显示文本内容
# 1 打印模式空间,文件内容会重复显示(每行内容显示2遍)
sed 'p' filename
# 示例,打印空间模式显示文件内容。
sed 'p' emp.txt
# 2 正常显示文件内容,这里n参数是取消自动打印模式空间和参数--quiet、--silent等同。
sed -n 'p' filename
# 显示文件实际内容,加了-n参数。
sed –n 'p' emp.txt
指定范围显示
# 1 显示行号n1到n2的内容
sed -n 'n1,n2 p' filename
# 示例,即指定了行号3和5之间的文本内容,结果如下,可对比原始的数据行号查验。
sed -n '3,5 p' emp.txt
7521,ward,salesman,7698,'1981-2-22',1250,500,30
7566,jones,manager,7839,'1981-4-2',2975,null,20
7654,martin,salesman,7698,'1981-9-28',1250,1400,30
# 2 显示行号n1到文末的内容,这里的$指末尾
sed -n 'n1,$ p' filename
# 示例,即显示从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,1
# 3 以+(加号)匹配文件从n1行到n1+n行的内容。
sed -n 'n1,+n p' filename
# 示例,匹配第4行到(4+3)7行之间的内容,可对照原始数据核验。
sed -n '4,+3 p' emp.txt
#结果见
7566,jones,manager,7839,'1981-4-2',2975,null,20
7654,martin,salesman,7698,'1981-9-28',1250,1400,30
7655,jack,manager,7698,'1987-3-28',1600,1800,10
7656,tim,clerk,7902,'1982-12-12',1400,1400,30
# 4 以(~)波浪线匹配行号,以n1作为行号的开始、n2为间隔递增方式匹配行号显示内容。
sed -n 'n1~n2 p' filename
# 示例,以第3行开始,每过4行递增即对应行3,7,11,15,19的内容。
sed -n '3~4 p' emp.txt
7521,ward,salesman,7698,'1981-2-22',1250,500,30
7656,tim,clerk,7902,'1982-12-12',1400,1400,30
7782,clark,manager,7839,'1981-1-9',2450,null,10
7876,adams,clerk,7788,'1983-1-12',1100,null,20
模式匹配
# 1 匹配文件内含word的内容。
sed -n '/word/ p' emp.txt
# 示例,匹配文本中所有含“clerk“关键字的数据。
sed -n '/clerk/ p' emp.txt
7369,smith,clerk,7902,'1980-12-17',800,null,20
7656,tim,clerk,7902,'1982-12-12',1400,1400,30
7657,kate,clerk,7902,'1989-11-11',1400,1800,10
7876,adams,clerk,7788,'1983-1-12',1100,null,20
7900,james,clerk,7698,'1981-12-3',950,null,30
7934,miller,clerk,7782,'1982-1-23',1300,null,10
# 2 指定行号匹配文件内含关键字word对应的内容
sed -n '/word/,n p' emp.txt
#这里先做几个约定:
# 1定义3个变量:首次匹配word的行号f、最后匹配word的行号l、参数行号n。
# 2 这里遍历的关键字是”manager”即寻找所有的经理们。
# 3 由假设1和2则f是4,l是11。
# 示例 2_1 n小于f的情况,结合当前情况和数据,这里n取2。这时我们不难发现返回的结果是仅匹配“manager“的内容。
sed -n '/manager/,2 p' emp.txt
7566,jones,manager,7839,'1981-4-2',2975,null,20
7655,jack,manager,7698,'1987-3-28',1600,1800,10
7698,blake,manager,7839,'1981-5-1',2850,null,30
7782,clark,manager,7839,'1981-1-9',2450,null,10
# 示例 2_2 如果n>f且n<l,
# 不难发现即有第4到10行内容和10行后仅匹配“manager“的内容汇总而来。
# 即这种情况下的文本内容由f行到n行的内容和n行后仅匹配manager的行两部分组成。
sed -n '/manager/,10 p' emp.txt
7566,jones,manager,7839,'1981-4-2',2975,null,20
7654,martin,salesman,7698,'1981-9-28',1250,1400,30
7655,jack,manager,7698,'1987-3-28',1600,1800,10
7656,tim,clerk,7902,'1982-12-12',1400,1400,30
7657,kate,clerk,7902,'1989-11-11',1400,1800,10
7698,blake,manager,7839,'1981-5-1',2850,null,30
7699,dlake,salesman,7839,'1983-6-15',3000,null,10
7782,clark,manager,7839,'1981-1-9',2450,null,10
# 示例 2_3 如果 n>=l,数据来自行4和13之间,即内容是f行到n行。
sed -n '/manager/,13 p' emp.txt
7566,jones,manager,7839,'1981-4-2',2975,null,20
7654,martin,salesman,7698,'1981-9-28',1250,1400,30
7655,jack,manager,7698,'1987-3-28',1600,1800,10
7656,tim,clerk,7902,'1982-12-12',1400,1400,30
7657,kate,clerk,7902,'1989-11-11',1400,1800,10
7698,blake,manager,7839,'1981-5-1',2850,null,30
7699,dlake,salesman,7839,'1983-6-15',3000,null,10
7782,clark,manager,7839,'1981-1-9',2450,null,10
7788,scott,analyst,7566,'1982-12-9',3000,null,20
7839,king,president,null,'1981-11-17',5000,null,10
# 3 匹配文件内首次含word行到文件的末尾之间的内容.
sed -n '/word/,$ p' emp.txt
# 示例,即匹配首次出现“manager“的行到文件末尾的所有内容。
sed -n '/manager/,$ p' emp.txt
7566,jones,manager,7839,'1981-4-2',2975,null,20
7654,martin,salesman,7698,'1981-9-28',1250,1400,30
7655,jack,manager,7698,'1987-3-28',1600,1800,10
7656,tim,clerk,7902,'1982-12-12',1400,1400,30
7657,kate,clerk,7902,'1989-11-11',1400,1800,10
7698,blake,manager,7839,'1981-5-1',2850,null,30
7699,dlake,salesman,7839,'1983-6-15',3000,null,10
7782,clark,manager,7839,'1981-1-9',2450,null,10
7788,scott,analyst,7566,'1982-12-9',3000,null,20
7839,king,president,null,'1981-11-17',5000,null,10
7844,turner,salesman,7698,'1981-12-8',1500,0,30
7876,adams,clerk,7788,'1983-1-12',1100,null,20
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
# 4 匹配两个关键词word1、word2之间的内容,当word1、word2出现多次时,按照word1、word2对进行匹配。
sed -n '/word1/,/word2/ p' emp.txt
# 示例
#sed -n '/manager/,/salesman/ p' emp.txt
7566,jones,manager,7839,'1981-4-2',2975,null,20
7654,martin,salesman,7698,'1981-9-28',1250,1400,30
7655,jack,manager,7698,'1987-3-28',1600,1800,10
7656,tim,clerk,7902,'1982-12-12',1400,1400,30
7657,kate,clerk,7902,'1989-11-11',1400,1800,10
7698,blake,manager,7839,'1981-5-1',2850,null,30
7699,dlake,salesman,7839,'1983-6-15',3000,null,10
7782,clark,manager,7839,'1981-1-9',2450,null,10
7788,scott,analyst,7566,'1982-12-9',3000,null,20
7839,king,president,null,'1981-11-17',5000,null,10
7844,turner,salesman,7698,'1981-12-8',1500,0,30
#以manager、salesman成对匹配,匹配过程中有manager的以普通内容处理。详细解释见下图:
# 5 匹配两个关键词word所在行和随后的n行内容。
sed -n '/word/,+n p' filename
# 示例,以clerk为关键字匹配,并输出匹配行和随后的2行。
sed -n '/clerk/,+2 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
7656,tim,clerk,7902,'1982-12-12',1400,1400,30
7657,kate,clerk,7902,'1989-11-11',1400,1800,10
7698,blake,manager,7839,'1981-5-1',2850,null,30
7876,adams,clerk,7788,'1983-1-12',1100,null,20
7900,james,clerk,7698,'1981-12-3',950,null,30
7934,miller,clerk,7782,'1982-1-23',1300,null,10
以上是关于Linux sed 打印模式空间p命令使用案例的主要内容,如果未能解决你的问题,请参考以下文章