前言大多数项目在部署后都会在项目中添加日志文件和一些记录文件,而我们经常需要对相关文件中的字符进行分析或处理,因此掌握linux字符处理命令非常重要。比如:后端提供了某个接口,在接收请求的时候接收不到其中一个参数,但是你确定这个参数已经100%发送了,于是你查看请求日志文件,找出所有发送的记录数据,和后端同学排错(撕)。又如:一个文件中存储了很多与用户相关的数据,现在要把这些数据写入数据库,但是这些数据中有很多重复的数据,这些数据中有很多无用的符号。如果在程序中一直在文件中查找和替换数据,势必会减慢程序的运行速度。如果使用linux命令清除文件中的重复数据和无用数据,如果使用处理器的话会方便很多。创建两个简单的文件,分别是1.txt和2.txt,下面用这两个文件作为演示#1.txta:aa1B:b1xxxc:c1xxxd:d1:end#2.txta:a2b:b2xxxc:c2xxxd:d2:end2pipeline石油管道和天然气管道是现实生活中的管道,linux中也存在管道。它是一个4KB的缓冲区。当我们要输出的文件内容过多时,终端可能会翻屏。导致之前的内容无法查看,此时pipeline就可以派上用场了。例如查看系统程序二进制文件bash内容more/bin/bash#查看目录列表,如果目录列表足够多,也会触发管道ls-a|more因为“/bin/bash”是二进制文件,所以去图片中出现乱码;当内容超过4KB时,输出结果中会出现冒号,可以使用键盘上下键来回翻页。它像一根管子吗?查找字符grepregex[file...][-RiVlnc]#-R:文件夹递归搜索模式#-i:搜索匹配时忽略大小写#-V:显示不匹配的行#-l:列出匹配的文件名pattern#-n:列出搜索目标所在行号#-c:统计匹配行总数,不显示行信息grep以行为单位搜索,包含3个参数,"regex"为字符串或正则表达式,"file"为文件或文件夹名称,-R为Result过滤选项。基本用法#用":"查找内容grep":"1.txt通过正则表达式查找#查找符合正则表达式的数据行grep"^\\w\{1\}:\\w\{1,2\}$"1.txt"a:aa1"没有出现在搜索结果中,因为结尾不符合正则{1,2}正则表达式有“通配符”和“POSIX”两种风格的普通字符,用""转义,否则会被当作普通文本文件夹递归搜索#testmeansfoldergrep"^\\w\{1\}:\\w\{1,2\}$"test-R#If搜索内容太多,可以使用管道grep"^\\w\{1\}:\\w\{1,2\}$"test-R|更多内容排序sort[file][-urontkkfbc]#u去重#r降序#o写入文件#n按数字顺序排列#t设置搜索分隔符#k一般配合-t根据列数排序#f忽略大小写#b忽略每行前面的空格#c内容是否排序所以需要使用sort提供的其他选项。分隔内容排序#内容以冒号分隔,使用第二列数据排序。如果没有第二列数据,linux会默认使用空字符串来填充排序。-t:-k21.txt排序后的内容输出到新的File#使用-o选项sort1.txt-onew1.txt;#当然也可以使用>sort1.txt>new2.txt去重uniq[-i-c]#-i忽略大小写#-c查找行数uniq1返回结果中有两个“xxx”.txt,因为uniq去重是指内容相同的连续两行或多行,所以uniq一般和sort一起使用。排序1.txt-usort1.txt|uniqintercepttextcut[-df]#-dcustomdelimiter#-f指定列,一般配合-dcat1.txt|使用cut-d':'-f2使用-f参数。如果指定的列不存在,程序会先检查分隔符是否存在。如果整行数据中有分隔符,则会用空格代替。如果不存在,它将使用整行数据返回输出。文本转换tr[-cdst]#-ssqueeze-repeats:将连续重复的字符表示为单个字符;例如"aa"=>"a"#-ddelete:删除属于第一个字符集的所有字符;#将小写转换为大写cat1.txt|tr"[a-z]"[A-Z]#如果两个“a”字符连在一起,它们将被视为一个“a”cat1.txt|tr-s"a""z"#删除数字字符集cat1.txt|tr-d"[0-9]"#删除"a"和":"cat1.txt|tr-d"a:"tr命令只能按照字符集映射替换处理,如"a-A,b=>",不支持正则表达式。也不支持将连续的字符串替换为特定的字符串,比如“abc”替换为“xyz”。如果这样做,程序将映射并替换“a=>x,b=>y,c=>z”。tr命令比较简单,但是功能太弱了。一般值用于替换特殊字符映射替换,如删除大小写数字。文本合并粘贴[-d][file][targetFile]#-d合并分隔符,默认为""空格字符串#普通合并粘贴-d"1.txt""2.txt"#设置分隔符为":",paste-d":""1.txt""2.txt">"new.txt"文本合并不是将文本b的内容追加到文本a的内容中,而是将文本b的每一行内容追加toa文本对应内容后的行号。文本合并的用例很少。文件拆分合并文件拆分拆分[-bl][文件名][目标前缀]#-b按大小拆分#-l按行数拆分#按每个文件大小拆分2k拆分-b2k"1.txt""new"#按照每个文件5行文本的大小拆分split-l5"1.txt""new"二进制文本没有行号,只能按大小拆分合并catnew*>"target.txt"场景示例在上传或下载大文件时,传输不断中断,不得不重新传输。可以先将大文件分割成小文件分批传输,传输完成后再合并。参考正则表达式
