Linux sed 写命令常见使用案例
Posted ShenLiang2025
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux sed 写命令常见使用案例相关的知识,希望对你有一定的参考价值。
Linux sed w命令常见使用场景汇总
声明与简介
sed:Stream Editor文本流编辑,sed是一个“非交互式的”面向字符流的编辑器。本文主要以实际的数据来介绍sed的write space(写空间)即w命令的使用。
数据说明
如下是使用的示例文本数据,这里的行号是为了方便解释结果,不是文本内容。
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
w命令
W命令即是写空间(write space)是对sed的输出流里的数据输出到指定文件的操作,该操作对原文件没有影响。
文本内容输出(写)
内容输入到新文件并回显控制台
# 1 将文件infilename的内容输出到outfilename里同时打印在控制台上。
sed 'w outfilename' infilename
# 示例,将emp.txt的内容写入outfile.txt并屏显
sed 'w outfile.txt' emp.txt
内容输入到新文件并屏不回显
# 2 将文件infilename的内容输出到outfilename里不打印在控制台上(静默方式)。
sed -n 'w outfilename' infilename
# 示例,将emp.txt的内容写入outfile.txt不屏显
sed -n 'w outfile.txt' emp.txt
指定具体行号输入到新文件
# 3 将文件infilename的第m行内容输出到outfilename里。
sed -n 'm w outfilename' infilename
# 将mp.txt里第17行内容输入到文件outfile.txt内
sed -n '17 w outfile.txt' emp.txt
指定行号范围输入到新文件
# 4 将文件infilename的第m到n行内容输出到outfilename里。
sed -n 'm,n w outfilename' infilename
# 将mp.txt里第14到16行内容输入到文件outfile.txt内
sed -n '14,16 w outfile.txt' emp.txt
cat outfile.txt
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
指定行号到结尾输入到新文件
# 5 将文件infilename的第m行到文件结尾内容输出到outfilename里。
sed -n 'm,$ w outfilename' infilename
# 将emp.txt第18行到文件结尾部分输出到outfile.txt
sed -n '18,$ w outfile.txt' emp.txt
#结果
--7902,ford,analyst,7566,'1981-12-3',3000,null,20
7934,miller,clerk,7782,'1982-1-23',1300,null,10
指定递增行号输入到新文件
# 6 将文件infilename的第m行以n为增幅(步长)行号的内容输出到outfilename里。
sed -n 'm~n w outfilename' infilename
# 示例,该情况会将8、13、18行的内容写入新文件outfile.txt里
sed -n '8~5 w outfile.txt' emp.txt
7657,kate,clerk,7902,'1989-11-11',1400,1800,10
7839,king,president,null,'1981-11-17',5000,null,10
--7902,ford,analyst,7566,'1981-12-3',3000,null,20
写文件结合模式匹配
匹配关键字方式写文件
# 1 将文件infilename的以匹配word的内容输出到outfilename里。
sed -n '/word/ w outfilename' infilename
# 匹配emp.txt文件里manager关键字,写入到outfile.txt
sed -n '/manager/ w outfile.txt' emp.txt
匹配关键字结合行号写文件
# 2 对文件infilename针对匹配的行n开始关键字word,然后把内容输出到outfilename里。
sed -n '/word/,n w outfilename.txt' infilename
# 这里先做几个约定:
# 1定义3个变量:首次匹配word的行号f、最后匹配word的行号l、参数行号n。
# 2 这里遍历的关键字是”manager”即寻找所有的经理们。
# 3 由假设1和2则f是4,l是11。
# 2_1 当n小于等于f时,这里4小于等于4,仅显示匹配到manager的行。
sed -n '/manager/,4 w outfile.txt' emp.txt
#cat outfile.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到7行内容和7行后仅匹配“manager“的内容汇总而来。
# 即这种情况下的文本内容由f行到n行的内容和n行后仅匹配manager的行两部分组成。
sed -n '/manager/,7 w outfile.txt' emp.txt
#cat outfile.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
7698,blake,manager,7839,'1981-5-1',2850,null,30
7782,clark,manager,7839,'1981-1-9',2450,null,10
# 2_3 如果 n>=l,数据来自行4和12之间,即内容是f行到n行。
sed -n '/manager/,12 w outfile.txt' emp.txt
#cat outfile.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
关键字首次出现行写文件
# 3 对文件infilename关键字word首次出现的行直至文末的内容输出到outfilename里。
sed -n '/word/,$ w outfilename' infilename
# 将emp.txt文件里首次出现的行写入到文件outfile.txt内。
sed -n '/manager/,$ w outfile.txt' emp.txt
# cat outfile.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 infilename里匹配两个关键词word1、word2之间的内容,当word1、word2出现多次时,按照word1、word2对进行匹配。输出到outfilename
sed -n '/word1/,/word2/ w outfilename' infilename
# 示例,成对匹配两个关键字并输出到文件。
sed -n '/manager/,/salesman/ w outfile.txt' emp.txt
[root@host_128 shellscrips]# cat outfile.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
关键字匹配及随后行写文件
# 5 infilename里匹配两个关键词word所在行和随后的m行内容,输出到outfilename。
sed -n '/word1/,+m w outfilename' infilename
#示例 匹配clerk关键字并将随后的2行写入文件outfile.txt内。
sed -n '/clerk/,+2 w outfile.txt' emp.txt
[root@host_128 shellscrips]# cat outfile.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 写命令常见使用案例的主要内容,如果未能解决你的问题,请参考以下文章