linux学习笔记——过滤器

本文介绍了多种文本处理工具,如cat、split、tac等,用于过滤、比较、统计文本数据,适用于初学者和专业人士。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

filters 333
过滤器就是任何能够从标准输入读取文本数据并向标准输出写入文本数据(每次一行)的程序。通常大多数过滤器能够出色完成一件任务。


cat
cat代表catenate,来自拉丁语,意思是chain,可能这是最简单的过滤器,它从标准输入读取数据,并将数据不加修改的写入到标准输出,数据可以来源于标准输入或者一个或多个文件,语法为:
cat [-bns] [file...]
file是文件名称
下面是一些有用的模式:
语法 作用
cat>file 从键盘读取数据,创建新文件或者替换已有文件
cat >>file 从键盘读取数据,将数据追加到 已有文件中
cat <file 从文件读取数据,输出到终端
cat file 从文件读取数据,输出到终端
cat<file1>file2 复制文件
cat file1 file2 file3 | less 组合多个文件,每次一屏地显示结果
cat file1 file2 file3 >file4 组合多个文件,将输出保存到一个不同文件中
cat file1 file2 file3 | program 组合多个文件,将输出通过管道传送给另一程序
-n(number)选项:在每行前面加一个行号
-b(blank)选项:和-n选项一起使用,告诉cat不要对空白行编号
-s(squeeze)选项:将多个连续空白行替换为一个空白行


split
split可以将一个大文件划分成几个较小的文件,语法为:
split [-d] [-a num] [-l lines] [file [prefix]]
其中,num是创建文件名时用作文件名后缀的字符或数字数量,lines是每个新文件所包含行的最大数量,file是输入文件的名称,prefix是创建文件时使用的名称
-d选项:使用数字后缀
-a选项:指定数字或字符位数
-l选项:指定每个分文件中的最大行数
例如:split -d -l 40 supporters voter


tac
tac于cat类似,但他们之间一个主要区别就是,tac在将文本写入到标准输出之前将文本行的顺序反转,语法为:
tac [file...]


rev
rev程序将文件各行中的字符顺序反转,语法为:
rev [file...]


head、tail
当拥有的数据太多,不容易理解时,这两个程序可以快速选取部分数据,其中head从数据开头选取数据行,tail从数据末尾选取数据行,语法为:
head [-n lines]
tail [-n lines] 
其中,lines是希望选取数据行的数量


colrm
colrm(column remove,列移除)程序从标准输入读取数据,删除指定的数据列,然后将剩余数据写入到标准输出,语法为:
colrm [startcol [endcol]]
其中,startcol、endcol分别是起始列号和终止列号


----------------------比较和抽取文件


cmp
用来比较任意两个文件,文本文件或者二进制文件,查看两个文件是否相同,语法:
cmp file1 file2
如果两文件相同,则不返回消息,否则显示一个合适的消息


comm
comm程序一行一行地比较两个有序的文本文件,可以查看两文件之间的区别,语法为:
comm [-123] file1 file2
file1和file2是有序文本文件的名称
该程序以3列显示输出:第一列包含只在第一个文件中有的行;第二列包含只在第二个文件中有的行;第三列包含两个文件中都有的行
-1、-2、-3选项:分别抑制掉第一列、第二列和第三列的输出


diff
diff可以用来比较两个无序文件,也可以用来比较大的文件,语法为:
diff [-bBiqswy] [-c|-Clines|-u|Ulines] file1 file2
其中,file1和file2是文本文件的名称,lines是说明上下文关系的行号
当比较的两个文件相同时,diff不显示任何输出(与cmp相似),如果两个文件不同,那么diff默认情况下显示一组指示,如果遵循这些指示,将把第一个文件修改为第二个文件
diff的输出使用3个不同的单字符指示:c(change)、d(delete)和a(append)。
c、d、a每个字符的左边和右边都有一串行号,可能是一个单独的行号,也可能是一串行号。左边的数字指第一个文件中的行,右边的数字指第二个文件中的行
第一个文件中的行用<标记,第二个文件中的行用>标记
-i(case insensive)选项:不区字母分大小写
-w(whitespace)选项:忽略所有空白符
-b(blank)选项:不忽略所有空白符,近忽略空白符数量上的区别
-B(blank lines)选项:忽略所有空白行
-q(quiet)选项:省略所有细节,与cmp类似
diff还有一些优化阅读的选项,但是不太简洁,就不做介绍


cut
cut程序是一个从数据中抽取指定列,并将其他内容抛弃的过滤器(于colrm相反)。cut程序拥有极大的灵活性,它既可以从每行中抽取指定列,也可以从每行中抽取指定的字段。
cut的语法(当抽取数据列时):
cut -c list [file...]
其中list是要抽取的列的列表,file是输入文件的名称
cut -f list [-d delimiter] [-s] [fie...]
其中,list是抽取字段的列表,delimiter是分割字段所使用的定界符,file是输入文件的名称
-f(field)选项:指定字段
-s(suppress,抑制)选项:抛弃不包含定界符的行


paste
paste程序组合数据列,可以将几个文件(其中每个文件都包含一列数据)组合成一个大表。语法为:
paste [-d delimiter...] [file...]


----------------------------统计和格式化


nl
nl过滤器提供一个简单但是有用的服务:它在文本中插入行号。语法为:
nl [-v start] [-i increment] [-b a] [-n ln|rn|rz] [file...]
其中start是起始编号,increment是增量,而file是文件的名称
默认情况下,nl不对空行编号,为了强制nl对所有行编号,可以使用-b(body numbering,正文编号)选项,后面跟字母a(all lines,所有行):
nl -b a file
-b选项还有其他变体,但是很少使用。
其次,可以使用-n(number format,数字格式)选项,后面再跟一个代码来控制数字的格式:
ln=左对齐,没有前导0
rn=右对齐,没有前导0
rz=右对齐,有前导0


wc
wc(word count)程序统计行、单词和字符的数量。所统计的数据可以来自另一个程序或者一个或多个文件,wc程序的语法:
wc [-clLw] [file...]
默认情况下,wc程序的输出包含3个数字,数据中的行数、单词数和字符数
如果不希望显示全部数字,可以使用选项:-l(统计行)、-w(统计单词)、-c(统计字符),当使用选项时,wc只显示请求的数字。-L选项显示最长行


expand
expand程序将输入文件中所有的制表符改变成空格,并且同时维持于原始文本相同的对其方式,语法:
expand [-i] [-t size | -t list] [file...]
其中size是固定宽度制表符的大小,list是制表位列表,而file是文件的名称
-i(initial)选项:只在转换行开头的制表符
-t选项:设置制表位的大小,或者位置


unexpand
unexpand程序将空格转换成制表符,语法为:
unexpand [-a] [-t size | -t list] [file...]
其中size是固定宽度制表符的大小,list是制表位列表。file是文件的名称
unexpand和expand的一个重要区别就是默认情况下,unexpand程序只替换行开头的空格,这是因为大多数时候,只使用unexpand程序进行缩进。
-a(all)选项:替换所有的空格


fold
行格式化。fold程序执行一项简单的任务:将长行分隔成短行。语法为:
fold [-s] [-w width] [file...]
其中width是新行的最大宽度,file是文件的名称
默认情况下,fold程序在位置80处分隔。fold所做的就是在合适的位置插上回车符
-s选项:不分隔单词


fmt
段落格式化。fmt的目标是将段落中的各行连接在一起,从而使段落尽可能短小和紧凑,而且还不改变内容和空白符。语法为:
fmt [-su] [-w width] [file...]
其中width是最大宽度,file是文件名称
fmt读取文本时,假定段落由空行分隔。默认行宽75字符,
-u(uniform spacing,统一间距)选项:减少空格,使单词之间最多只有一个空格,句子末尾最多两个空格,即:法国式间距
-s(split only,仅拆分)选项:拆分长行,不连接短行(在编写计算机程序时可以使用这个选项)


pr
按页格式化,使其适合于打印。pr程序还可以按列格式化文本,并且还可以合并多个文件中的文本。
语法(按页格式化):
pr [-dt] [+beg[:end]] [-h text] [-l lines] [-o offset] [-W width] [file...]
其中beg是需要格式化的第一页,end是需要格式化的最后一页;text是标题中间的文本;lines是每页的行数;offset是左边缘的大小;width是输出的宽度;file是文件名称
通常将pr作为管道线的一部分,以便在将文本发送给打印机之前对文本进行格式化
-d(double)选项:将数据格式化为双倍行距
-t选项:页之间没有分隔,意味着所有的行都用于正文
+选项:设定打印页的范围
-l:设定每页的行数
-o:设定偏移量,即是左边缘大小
-W:改变输出宽度(默认是72字符)
当使用-W选项时,太长的行会被折断,因此,一定要小心,不要丢失文本
语法(按列格式化):
pr [-mt] [-columns] [-l lines] [-W width] [file...]
其中column是输出列的数量,lines是每页的行数,width是输出的宽度,file是文件的名称
-选项:输出列的数量
-m(merge,合并)选项:将多个文件分别格式化成单独的列
注意,如果格式化3个文件,那么每列的最大宽度默认是23字符,如果输入文件包含的行大于列宽,pr就将其截断,为避免这种事情发生,在将文本发送给pr之前应现格式化。


-----------------------------选取、排序、组合及变换


grep
grep程序从标准输入或者文件中读取数据,抽取所有包含特定模式的行,并写到标准输出。re代表正则表达式,g代表global,p代表print。语法为:
grep [-cilLnrsvwx] pattern [file...]
其中pattern是要搜索的模式,file是输入文件的名称
当指定包含标点符号或者特殊字符的模式时,应该将它们引用,从而使shell能够正确地解释命令
如果grep没有查到与指定模式匹配的行,则没有任何输出或者警告信息产生
-c(count)选项:显示所抽取行的数量,而不是所抽取的行本身
-i选项:忽略字母大小写
-n选项:在输出的每一行前面写一个相对行号
-l(list filename)选项:当在多个文件中搜索特定模式时,列举包含特定模式的文件名称
-L选项:正好和-l选项相反,显示不包含匹配模式的文件
-w选项:只搜索完整的单词
-v(verse)选项:选取不包含指定模式的所有行
-x选项:选取匹配模式占整行的那些行
-r(recursive,递归)选项:搜索整个目录树
-s(suppress)选项:不显示错误消息


fgrep
grep的一种变体,只搜索匹配“固定字符”的字符串,速度更快


egrep
grep的一种变体,原始的grep只允许“基本的正则表达式”,而egrep支持功能更强大的“拓展正则表达式ERE”
也可以使用grep -E使用拓展正则表达式


look
look程序搜索以字母顺序排列的数据,并查找所有以特定模式开头的行
look程序的使用方式有两种,即使用一个或多个文件中的有序数据,或者让look搜索一个字典文件
当使用look搜索一个或多个文件时,语法为:
look [-df] pattern file...
其中pattern是搜索的模式,file是文件名称
look不能从标准输入读取数据,必须从一个或多个文件中获取输入,这意味着,严格讲,look并不是一个过滤器
因为look使用的是二分法查找数据,所以,在使用look搜索数据之前,必须先排序
-d(dictionary,字典)选项:只考虑字母和数字,忽略其他字符
-f(fold,等同)选项:忽略字母大小写
look pattern可以搜索所有以pattern开头的单词


sort
sort程序执行两个相关的任务:排序数据以及查看数据是否已经有序。基本语法:
sort [-dfnru] [-o outfile] [infile...]
其中outfile是存放输出文件的名称,infile是包含输入的文件的名称
sort提供了一个特殊的选项,允许将输出保存到任何希望的文件中,包括源文件:
-o选项:输出文件名称
sort程序有几个选项,可以用来控制sort程序的工作方式
-d(dictionary)选项:只查看字母、数字和空白符
-f(fold)选项:同等对待大写字母和小写字母,也就是忽略大小写
-n(numeric,数字)选项:识别行开头或者字段开头的数字,并按数字进行排序,这样的数字包括前导0、负号和小数点,使用该选项表示使用的是数值数据
-r(reverse)选项:按反向顺序对数据排序
-u(unique)选项:查找相同的行,并将相同的行只留下一行
检查数据是否已经有序
sort  -c[u] [file]
-c(check)选项:不排序数据,只检查数据是否已经有序
-cu选项:sort将以两种方式检查,以确保数据是有序的、所有行都是唯一的


ASCII码需要记住的三个原则:
1.空格在数字之前
2.数字在大写字母之前
3.大写字母在小写字母之前


uniq
查找重复行,uniq的数据必须是有序的。语法为:
uniq [-cdu] [infile [outfile]]
其中,infile是输入文件的名称,outfile是输出文件的名称
-c选项:统计重复出现的次数
-d选项:只查看重复行
-u选项:只查看唯一行


join
join程序用来合并两个程序中的有序数据,基于匹配的字段组合两组数据,语法为:
join [-i] [-a1|-v1] [-a2|-a2] [-1 field1] [-2 field2] file1 file2
join假定联接字段是每个文件的第一个字段,但这可以改变
join的默认输出包含三部分:公共联接字段值、第一个文件剩余部分、第二个文件剩余部分。就是说,只显示联接字段匹配的那一部分
-a1选项:让file1全部显示
-a2选项:让file2全部显示
没有使用-a选项时,结果为内联接,使用-a选项时,结果为外联接,因为输出还包含联接字段不匹配的行
-v1(reverse)选项:只显示file1中不匹配的行,忽略匹配行
-v2(reverse)选项:只显示file2中不匹配的行,忽略匹配行
-i(ignore):忽略字母大小写
排序结果跟LC_COLLATE环境变量有关


tsort
分析一组偏序,其中每个偏序都代表一个约束,计算满足全部约束的全序,语法为:
tsort[file]


tr
tr(translate,转换)程序可以对字符执行3种的运算 。1.将字符改变成其他字符。2.可以指定如果要转换的字符连续出现不止一次,则用一个单独的字符替换。3.删除指定的字符。tr语法为:
tr[-cds] [set1 [set2]]
其中set1和set2是字符组
tr执行的基本运算就是转换,例如:tr abc ABC < old > new
tr还可转换不可显示字符,比如控制字符
-s(squeeze)选项:将第一组中的多个连续字符替换为一个单独的字符
-d(delete)选项:删除指定的字符
-c选项:匹配所有不在第一组中的字符


sed
sed(stream editor,流编辑器)是一个非交互式文本编辑器,语法为:
sed [-i] command | -e command... [file..]
我不太喜欢sed编辑文本的方式,所以,就不再解释用法了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值