当前位置: 首页 > Linux

【Linux】Linux常用命令

时间:2023-04-06 03:45:06 Linux

作者:LogM是不同标准的正则表达式,和C++、Python、Java中的正则表达式标准不太一样。真的很痛苦。详见正则表达式派的回顾。1.findfilesearch#Findtxtfiles#-iname:Ignorecasefind.-name"*.txt"找到.-iname"*.txt"#正则表达式查找.txt和.cpp文件,注意特殊符号用`\`#转义-iregex:忽略大小写find.-regex".*\.\(txt\|cpp\)$"找到.-iregex".*\.\(txt\|cpp\)$"#使用`!`取反,查找所有不是.txt或.cpp的文件find.!-regex".*\.\(txt\|cpp\)$"#查找指定深度和指定类型:f是文件,d是目录,l是符号链接find。-maxdepth3-typef#搜索后执行指定操作,`-ok`提示是否逐个文件执行操作,`-exec`不提示,注意find最后的`;`。-输入f-name"*.txt"-okcat{}\;find.-typef-name"*.txt"-execcat{}\;#排除指定文件夹find/-path"/home"-prune-o-path"/proc"-prune-o-name"*.txt"2.greptextsearch#在一个文件中查找"match_pattern",允许多个文件,支持正则表达式grep"match_pattern"file_1file_2file_3#grep使用的正则表达式有点特殊,我就用`-P`打开“PCREregularcompatibility”grep-P"match_pattern"file_1file_2file_3#只打印匹配到的文件名grep-l"match_pattern"file_1file_2file_3#忽略大小写grep-i"match_pattern"file_name#输出除"match_pattern"以外的其他行grep-v"match_pattern"file_name#在输出结果中,高亮匹配区域grep"match_pattern"file_name--color=auto#只输出匹配"match_pattern"的区域,不输出一行grep-o"match_pattern"file_name#每次输出前都加上该区域在原文件中的位置(第一个字符为0,第二个字符为1,以此类推),一般与`-b``-o`配合使用withgrep-b-o"match_pattern"file_name#在每行输出前,带上该行在原文件中的行号grep-n"match_pattern"file_name#统计文件中包含文本的行数grep-c"match_pattern"file_name#在目录中递归查找,`-r`和`-R`效果一样e".*\.html"-e".*\.php"file_name#`-E`使用正则表达式的方式变了,相当于egrep,好像不再需要`|`和`&`了`\`进行转义,`*`表示任意数字grep-E"*\.php|*\.html"file_name--color=auto#的任意字符等同于grep".*\.html\|.*\.php"file_name3.xargs命令行参数转换xargs可以将输入数据转换为特定命令的命令行参数;这样就可以和很多命令结合使用,比如grep,比如find。#将多行输出转换为单行输出(`\n`为多行文本之间的分隔符)catfile.txt|xargs#单行转多行输出(`-n`指定每行显示的字段数)catsingle.txt|xargs-n3#xargs参数说明:#-d定义分隔符(默认为空格,多行分隔符为\n)#-n指定输出为多行#-I{}指定替换字符串,xargs展开时会替换这个字符串,当执行的命令需要多个参数时使用#将所有图片文件复制到/data/images目录下ls*.jpg|xargs-n1-I{}cp{}/data/images#打印目录下所有.cpp文件的行数findsource_dir/-typef-name"*.cpp"-print0|xargs-0wc-l4.sortsort#-n按数字排序VS-d按字典顺序排序#-r反向排序#-kN指定按第N列排序#-t指定分隔符sort-nrk1data.txtsort-bddata#忽略前导空格,如空格字符#当指定分隔符为特殊字符时,需要注意sort-t'\t'-k3a.txt#上面命令报错:sort:multi-charactertab`\t'#正确写法:sort-t$'\t'-k3a.txt5.uniq消除重复行#在使用`uniq`之前,必须先使用`sort`sortunsort.txt|uniq#该行去重后的结果sortunsort.txt|uniq-c#在行前打印本行重复次数sortunsort.txt|uniq-d#只打印重复行6.tr替换或删除字符echo"HELLOWORLD"|tr'A-Z''a-z'#将大写字母转换为小写猫文本|tr'\t'''#tabtospace#-ddeletecatfile|tr-d'0-9'#删除所有数字字符#-ccomplementsetcatfile|tr-c'0-9''?'#用'?'替换所有非数字字符猫文件|tr-d-c'0-9\n'#删除所有非数字字符,注意保留换行符和空格#-s压缩文本中的重复字符;最常用于压缩冗余空间的cat文件|tr-s''#删除重复的空格#字符类#tr中可用的各种字符类:#alnum:字母和数字#alpha:字母#digit:数字#space:空白字符#lower:小写#upper:大写#cntrl:control(non-printable)characters#print:printablePrintcharacters#Howtouse:tr[:class:][:class:]tr'[:lower:]''[:upper:]'#大小写转换即可也可以这样写7。cutSplittextbycolumn#cut从每一行切出字符串,并输出指定的列#-b:inbytes,显示每行的第n个字节#-c:incharacters,显示每行的第n个字符#-f:用分隔符分隔字段,显示每行第n个字段的内容#-d:指定字段的分隔符,默认字段分隔符为“TAB”#--complementcomplement,提取指定字段以外的列#cut取的范围:#N-第N个字段到最后#-M第一个字段是M#N-MN到M个字段cut-d";"-f2,4filename#提取文件的第二列和第四列Columns,`;`separatedcut-d";"-f3--complementfilename#提取文件除第3列外的所有列:cut-c1-5file#打印第一到第五个字符8.paste按列拼接文本#按列将两个文本拼接在一起pastefile1file2#默认按列方向合并paste-sfile1file2#按行方向合并pastefile1file2-d","#指定合并字段分隔符9.wc统计行数和字符数的工具wc-lfile#统计行数wc-wfile#统计字数wc-cfile#统计字符数10.sed文本替换工具#s是sed命令,表示替换字符#g为sed替换标记,表示替换所有#首先替换seg's/text/replace_text/'file#替换每行第一个匹配的文本#globalreplaceseg's/text/replace_text/g'file#-i直接修复更改源文件seg-i's/text/repalce_text/g'file#去掉空行:#d是sed命令,表示删除匹配行sed'/^$/d'file#变量转换,matched字符串被标记引用&echothisisenexample|seg's/\w+/[&]/g'$#Output:[this][is][en][example]#substringmatchingmark#第一个匹配的括号内容使用标记\1sed's/hello\([0-9]\)/\1/'#双引号求值#sed一般用单引号引用;也可以使用双引号,使用双引号后,双引号会对表达式求值:sed's/$var/HLLOE/'#使用双引号时,我们可以在sed模式和替换字符串中指定变量;例如:p=pattenr=replacedecho"lineconapatten"|sed"s/$p/$r/g"$>lineconareplaced#Otherexamples#Stringinsertioncharacters:Converteachlineoftext(PEKSHA)toPEK/SHASed's/^.\{3\}/&\//g'文件11.awk数据流处理工具#awk脚本结构awk'BEGIN{statements}statements2END{statements}'#工作方式:#执行begin中的语句块;#从文件或stdin中读取一行,然后执行statements2,重复这个过程,直到读取完所有文件;#执行结束语句块;#print打印当前行#使用不带参数的print,将打印当前行;echo-e"line1\nline2"|awk'BEGIN{print"start"}{print}END{print"End"}'#print用逗号分隔时,参数用空格分隔;回声|awk'{var1="v1";var2="V2";var3="v3";打印变量1、变量2、变量3;}'#输出:v1V2v3#使用-拼接字符('-'作为拼接);回声|awk'{var1="v1";变量2="V2";var3="v3";打印变量1"-"变量2"-"变量3;}'#输出:v1-V2-v3#特殊变量:NRNF$0$1$2#NR:表示记录数,在执行时对应当前行号;#NF:表示字段数,执行时始终对应当前行的字段数;#$0:该变量包含执行时当前行的文本内容;#$1:第一个字段Content的文本;#$2:第二个字段的文本内容;echo-e"line1f2f3\nline2\nline3"|awk'{printNR":"1"-"$2}'#打印每一行的第一行第二个和第三个字段:awk'{print$2,$3}'file#统计文件中的行数:awk'END{printNR}'file#累加每一行的第一个字段:echo-e"1\n2\n3\n4\n"|awk'BEGIN{sum=0;打印“开始”;}{sum+=$1;}END{打印“=”;printsum}'#使用style过滤awk处理过的行awk'NR<5'#行号小于5awk'NR==1,NR==4{print}'file#行号等于1and4打印出来awk'/linux/'#包含linux文本的行(可以用??正则表达式指定,超级强大)awk'!/linux/'#不包含linux文本的行#设置分隔符#使用-F来设置分隔符(默认为空格)awk-F:'{print$NF}'/etc/passwd#读取命令输出#使用getline将外部shell命令的输出读入变量cmdout;回声|awk'{"greproot/etc/passwd"|获取线路命令输出;printcmdout}'#在awk中使用循环for(i=0;i<10;i++){print$i;}for(iinarray){printarray[i];}#inreverseorderPrintlinein形式:(执行tac命令)seq9|awk'{lifo[NR]=$0;lno=NR}END{for(;lno>-1;lno--){printlifo[lno];}}'#awk实现head和tail命令#head:awk'NR<=10{print}'filename#tail:awk'{buffer[NR%10]=$0;}END{for(i=0;i<11;i++){printbuffer[i%10]}}'filename#打印指定列#awkimplementation:ls-lrt|awk'{print$6}'#执行ls-lrt|cut-f6#打印指定文本区域#确定行号seq100|awk'NR==4,NR==6{print}'#确定文本#打印start_pattern和end_pattern之间的文本;awk'/start_pattern/,/end_pattern/'文件名seq100|awk'/13/,/15/'cat/etc/passwd|awk'/mai.*mail/,/news.*news/'#awk常用内置函数#index(string,search_string):返回search_string在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\n",$1}'12.遍历文件中的行、单词和字符#1.遍历文件中的每一行#while循环方法whilereadline;doecho$line;done