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命令使用案例的主要内容,如果未能解决你的问题,请参考以下文章

Linux命令sed

sed命令n,N,d,D,p,P,h,H,g,G,x解析

linux常用命令-sed

linux三剑客sed之模式空间与保持空间

Linux三剑客(sed)-编辑匹配到的文本

sed高级命令及模式空间和交换空间简介