当前位置: 首页 > Linux

推荐收藏!超全LinuxShell文本处理工具合集

时间:2023-04-06 22:34:03 Linux

本文将介绍Linux下使用Shell处理文本时最常用的工具:find、grep、xargs、sort、uniq、tr、cut、paste、wc、SED,awk;示例和参数是最常用和最实用的;使用shell脚本的原则是单行写命令,尽量不要超过2行;如果你有更复杂的任务需求,可以考虑python。1.查找文件搜索txt和pdf文件查找。(-name"*.txt"-o-name"*.pdf")-打印查找.txt和pdffind的常规方法。-regex".*(.txt|.pdf)$"#-ire??gex:正则否定忽略大小写自定义搜索#Searchbytype:find.-typed-print//只列出所有目录#按时间查找:-atime访问时间(单位是天,分钟单位是-amin,下同)-mtime修改时间(内容被修改)-ctime修改时间(元数据或权限更改)最近7天内访问过的所有文件:查找.-atime7-typef-print#按大小搜索:查找大于2k的文件find.-typef-size+2k#按权限搜索:find.-typef-perm644-print//查找所有具有可执行权限的文件#Searchbyuser:find.-typef-userweber-print//查找用户weber找到所属文件后删除后续动作:#删除当前目录下的所有swp文件:find.-typef-name"*.swp"-delete#Executionaction(powerfulexec)find.-typef-userroot-execchownweber{};//改变当前目录的所有权为weber注意:{}是一个特殊的字符串,对于每一个匹配的文件,{}都会被替换为对应的文件名;例如:将所有找到的文件复制到另一个目录:find.-类型f-mti我+10-name"*.txt"-execcp{}OLD;合并多条命令提示:如果后面需要执行多条命令,可以将多条命令写成一个脚本,调用-exec时执行脚本;-exec./commands.sh{};#-print的分隔符使用''作为默认的文件分隔符;-print0使用''作为文件分隔符,这样可以搜索包含空格的文件;2.greptextsearchgrepmatch_pattenfile//默认获取匹配行常用参数:-o只输出匹配的文本行VS-v只输出不匹配的文本行-c统计文本在文件中出现的次数grep-c"text"filenamenprint匹配的行号i搜索时忽略大小写l只打印文件名递归搜索多级目录中的文本(程序员最爱的代码搜索):grep"class"。-R-n匹配多个模式grep-e"class"-e"vitural"filegrep输出以字符结尾的文件名:(-z)grep"test"file*-lZ|xargs-0rmxargs命令行参数转换xargs可以将输入数据转换为特定命令的命令行参数;这样,它可以与许多命令结合使用。比如grep,比如find;将多行输出转换为单行输出catfile.txt|xargs是多行文本之间的分隔符将单行转换为多行输出catsingle.txt|xargs-n3#-n:指定每行显示的字段数xargs参数说明-d定义分隔符(多行分隔符默认为空格)-n指定输出为多行-I{}指定替换字符串,当xargs展开时这个字符串会被替换,当要执行的命令需要多个参数时catfile.txt|xargs-I{}./command.sh-p{}-1#-0:指定为输入分隔符#statisticalprogramNumberoflinesfindsource_dir/-typef-name"*.cpp"-print0|xargs-0wc-l3,sort排序字段说明:-n按序号排序VS-d按字典序排序-r逆序排序-kN指定按第N列排序-nrk1data.txtsort-bddata//忽略leadingblankcharacterslikespaces4,uniqEliminateduplicatelines消除重复行sortunsort.txt|uniq统计文件中每一行出现的次数sortunsort.txt|uniq-c查找重复行sortunsort.txt|uniq-d可以指定每一行需要比较的重复内容:-s起始位置-w比较字符数5,用tr转换一般用法echo12345|tr'0-9''9876543210'//加解密转换,替换对应字符猫文|tr''''//制表符到空格tr删除字符catfile|tr-d'0-9'//删除所有数字-c补集cat文件|tr-c'0-9'//获取文件cat文件中的所有数字|tr-d-c'0-9'//删除非数字数据tr压缩字符tr-s压缩文本中出现的重复字符;最常用于压缩冗余空间的cat文件|tr-s''字符类:tr中可用的各种字符类alnum:字母和数字alpha:字母digit:数字space:空白字符lower:小写upper:大写cntrl:控制(不可打印)字符print:可打印字符如何使用:tr[:class:][:class:]eg:tr'[:lower:]''[:upper:]'6、cut按列拆分文本#截取文件的第二列和第四列:cut-f2,4filename#删除文件所有列在第3列中:cut-f3--complementfilename#-d指定分隔符:cat-f2-d";"filenamecut取范围N-第N个字段到最后-M第一个字段是MN-MN到M个字段切割单位-b以字节为单位-c以字符为单位-f以字段为单位(使用分隔符)cut-c1-5file//printthefirstto5Charactercut-c-2file//打印前2个字符7,pasteStitchtextbycolumn将两个文本拼接在一起catfile112catfile2colinbookpastefile1file21colin2book默认分隔符是制表符,可以用-d指定分隔符粘贴file1file2-d","1,colin2,book8,wc统计行数和字符数的工具wc-lfile//统计行数wc-wfile//统计字数wc-cfile//counts字符数为9,sed文本替换工具先替换sed's/text/replace_text/'file//替换每行第一个匹配的文本并全局替换sed's/text/replace_text/g'文件默认替换后,输出替换后的内容。如果需要直接替换原文件,使用-i:sed-i's/text/repalce_text/g'file去除空行:sed'/^$/d'filevariabletoconvertmatchedcharactersStringsarereferencedby令牌&.echo这是一个例子|seg's/w+/[&]/g'$>[this][is][en][example]子串匹配标记第一个匹配括号的内容使用标签引用sed's/hello([0-9])//'双引号求值sed通常用单引号引用;也可以使用双引号,使用双引号后,双引号会计算表达式:sed's/$var/HLLOE/'当使用双引号时,我们可以在sed模式和替换字符串中指定变量;p=pattenr=replacedecho"行conapatten"|sed"s/$p/$r/g"$>lineconareplacedstring插入字符:将文本中的每一行内容(PEKSHA)转换为PEK/SHAsed's/^.{3}/&//g'file10,awk数据流处理工具awk脚本结构awk'BEGIN{statements}statements2END{statements}'工作方式1.执行begin中的语句块;2.从文件或stdin中读取一行,并thenExecutestatements2重复这个过程,直到读取完所有文件;3.执行end语句块;print打印当前行,使用不带参数的print时,会打印当前行;echo-e"line1line2"|awk'var3="v3";printvar1,var2,var3;}'$>v1v2v3#使用-拼接字符(""为拼接字符);echo|awk'{var1="v1";var2="V2";var3="v3";printvar1"-"var2"-"var3;}'$>v1-V2-v3特殊变量:NRNF1$2NR:表示记录数,对应执行时的当前行号;NF:表示字段数,执行时始终对应当前行的字段数;$0:该变量包含执行时当前行的文本内容;$1:第一个字段的文本内容;$2:第二个字段的文本内容;echo-e"line1f2f3line2line3"|awk'{printNR":"$0"-"$1"-"$2}'#打印每行的第二个和第三个字段awk'{print$2,$3}'file#统计文件的行数:awk'END{printNR}'file#累加每一行的第一个字段:echo-e"1234"|awk'BEGIN{num=0;print"begin";}{sum+=$1;}END{pri新的“==”;printsum}'#pass外部变量var=1000echo|awk'{printvara}'vara=$var#inputfromstdinawk'{printvara}'vara=$varfile#inputfromfilewithstyle过滤awk处理过的行awk'NR<5'#行号少than5awk'NR==1,NR==4{print}'file#打印出等于1和4的行号awk'/linux/'#包含linux文本的行(可以用??正则表达式指定,超级强大)awk'!/linux/'#为不包含linux文本的行设置分隔符使用-F设置分隔符(默认为空格)awk-F:'{print$NF}'/etc/passwd读取命令output使用getline将外部shell命令的输出读入变量cmdout;回声|awk'{"greproot/etc/passwd"|获取线路命令输出;awk中的printcmdout}'使用循环for(i=0;i<10;i++){print$i;}for(iinarray){printarray[i];}以相反的顺序打印行:(tac命令的执行)seq9|awk'{lifo[NR]=$0;lno=NR}END{for(;lno>-1;lno--){printlifo[lno];}}'awk实现头尾命令head:awk'NR<=10{print}'filenametail:awk'{buffer[NR%10]=$0;}END{for(i=0;i<11;i++){printbuffer[i%10]}}'文件名打印指定列#awk实现:ls-lrt|awk'{print$6}'#cut执行ls-lrt|cut-f6打印指定文本区域#confirmlinenumberseq100|awk'NR==4,NR==6{print}'#确定文本打印startpattern和endpattern之间的文本;awk'/start_pattern/,/end_pattern/'文件enameseq100|awk'/13/,/15/'cat/etc/passwd|awk'/mai.*mail/,/news.*news/'awk常用内置函数index(string,search_string):返回search_string在字符串中的位置sub(regex,replacement_str,string):替换第一个内容由带有replacement_str的正则表达式匹配;match(regex,string):检查正则表达式是否可以匹配字符串;length(string):返回字符串长度echo|awk'{"greproot/etc/passwd"|获取线路命令输出;printlength(cmdout)}'#printf类似于C语言中的printf,格式化输出seq10|awk'{printf"->%4s",$1}'#迭代文件中的行、词和字符迭代文件中的每一行while循环方法whilereadline;doecho$line;done