Linux三剑客awk命令详解命令名称awk模式扫描和处理语言命令功能处理文本和数据详解awk是linux/unix中使用的一种编程语言接下来,过程文本和数据。数据可以来自标准输出(stdin)、一个或多个文件或其他命令的输出。它在命令行上使用,但更多时候作为脚本使用。awk有很多内置的函数,比如数组、函数等,这些和C语言是一样的,灵活性是awk最大的优势。语法格式awk[options]'scripts'var=valuefilename常用参数-F指定分隔符(可以是字符串或正则表达式)-f从脚本文件中读取awk命令-vvar=value赋值变量,将外部变量传递给awk脚本基本结构awk'BEGIN{print"start"}pattern{commands}END{print"end"}'filename一个awk脚本通常由三部分组成:BEGIN语句+模式匹配+END语句,这三部分是一个可选的工作原理:第一步是执行BEGIN语句,第二步是从文件或标准输入中读取一行,然后执行pattern语句,逐行扫描文件,直到读取完所有文件。第三步执行END语句示例显示:echo"hello"|awk'BEGIN{print"welcome"}END{print"2017-08-08"}'welcome2017-08-08echo-e"hello"|awk'BEGIN{print"welcome"}{print}END{print"2017-08-08"}'welcomehello2017-08-08#不加打印参数时,默认只打印当前行echo|awk'{一个=“你好”;b="你好";c="民工哥";打印a、b、c;}'hellonihaomingongge#打印时用逗号分隔,打印时用空格分隔echo|awk'{a="mgg";b=“明格”;c="民工哥";打印a"是"b"或"c;}'mgg是mingg或mingongge#awk的print语句中的双引号其实是一个拼接函数awk变量内置变量$0#当前记录$1~$n#当前记录的第N条记录FieldFS#输入字段分隔符(与-F作用相同)defaultspaceRS#输入记录分隔符,默认换行符NF#字段数为列NR#记录数为行号,默认从1开始OFS#输出字段分隔符,默认空格ORS#输出记录分隔符,默认换行符外部变量[mingongge@~]#a=100[mingongge@~]#b=100[mingongge@~]#echo|awk'{printv1*v2}'v1=$av2=$b10000awk运算判断算术运算符加减/&乘除余数^*求幂++--增减,作为前缀或后缀[mingongge@~]#awk'BEGIN{a="b";printa,a++,a--,++a;}'b011[mingongge@~]#awk'BEGIN{a="0";printa,a++,a--,++a;}'0011[mingongge@~]#awk'BEGIN{a="0";printa,a++,--a,++a;}'0001#和其他编程语言一样,所有运算都作为算术运算符,操作数自动转为值,所有非值转为0赋值运算符=+=-=*=/=%=^=**=正则运算符~!~匹配正则表达式/不匹配正则表达式逻辑运算符||&&逻辑或逻辑AND关系运算符<<=>>=!==其他运算符$#字段引用空间#Stringlinker?:#Trinityoperatorln#数组中是否有键值awkregular^Startoflinelocator$行尾定位器。匹配任意单个字符*匹配0个或多个前导字符(包括回车)+匹配1个或多个前导字符?匹配0个或1个前导字符[]匹配指定字符组中的任意字符/^[ab][^]匹配不在指定字符组中的任意字符()子表达式|or\转义字符~,!~匹配或不匹配条件语句x{m}x字符重复m次x{m,}x字符至少重复m次X{m,n}x字符至少重复m次但不超过n次(需指定参数-posix或--re-interval)Linux三剑客sed命令详细命令名称sed一个强大的流式文本编辑器详解sed是一个流式编辑器也是一个很好的文本编辑工具加工。当使用更强大的正则表达式处理时,当前处理的行存储在一个临时缓冲区中,称为“模式空间”,然后使用sed命令处理缓冲区的内容。完成后输出到屏幕,再处理下一行。命令格式sed[选项]'命令'文件sed[选项]-fscriptfilefile(s)常用参数-e#用指定的命令处理输入的文本文件-n#取消默认输出(如果与p命令同时使用,只打印改变的行**)-h#Help-V#显示版本信息常用命令a#在当前行下方插入文字i#在当前行上方插入文字c#将选中行更改为新文本d#Delete,删除选中行D#删除模板block第一行s#替换指定字符h#复制模板块的内容到内存缓冲区H#追加模板块的内容到内存缓冲区g#获取内存缓冲区的内容并替换currenttemplateblockTextG#获取内存缓冲区的内容,追加到当前模板块textl#不可打印字符列表n#读取下一个输入行,使用next命令处理新行而不是第一行命令N#将下一个输入行追加到模板块的末尾,并在两者之间嵌入一个新行,更改当前行号p#打印匹配行P#(大写)打印模板的第一行q#退出sedb#lable跳转到脚本中有label的地方,如果分支不存在,则跳转到脚本末尾r#filereadlinetfromfile#labelifbranch,从最后一行开始,一旦条件满足orT,tcommand,会跳转到有label的command,或者到脚本结尾T#label错误分支,从最后一行开始,一旦errororT,tcommand发生,它将导致分支到带有标签的命令,或者到脚本的末尾w#filewrite并将模板块附加到文件的末尾W#filewrite并将模板块的第一行附加到文件的末尾文件!#表示后面的命令会对所有未选中的行产生影响=#打印当前行号##将注释扩展到sed替换命令前的下一个换行符g#表示行内全面替换(全局替换用withs命令)p#表示打印行w#表示该行被写入文件x#表示交换模板块中的文本和缓冲区中的文本y#表示将一个字符翻译成另一个字符(但是正则表达式中不使用)1#子串匹配标记匹配字符串标记Sed正则^#匹配行开始$#匹配行结束。#匹配任何不是换行符的字符#匹配0个或多个字符[]#匹配指定范围内的字符[^]#匹配不在指定范围内的字符(..)#匹配子串保存搜索字符以替换其他字符<#匹配单词的开头>#匹配单词的结尾x{m}#重复字符x,m次x{m,}#重复字符x,至少m次x{m,n}#重复字符x,至少m次,不超过n次sed常见例子1.替换操作echo"helloworld"|sed's//-/1g'hello-world#全局将第一个空格替换为-,但是文本中只有一个空格2.删除操作sed'/^$/d'filename#删除空行sed'2d'filename#删除第二行sed'2,$d'filename#删除从??第二行到末尾的所有行sed'$d'filename#删除最后一行sed'/^test/'dfilename#delete以测试开始第3行,匹配并替换echo"helloworld"|sed's/w+/[&]/g'[hello][world]echo"helloworld"|sed's/w+/"&"/g'"hello""world"#w+匹配每一个单词,&表示匹配的字符串echoAAAbbb|sed's/([A-Z]+)([a-z]+)/[2][1]/'[bbb][AAA]#子串匹配替换4,选择范围sed-n'/=0/,/max/p'svnserve.conf#min-encryption=0#max-encryption=256#allin=0toLines在最大范围内会被打印出来5.sed多点编辑功能(-e)[root@centos001~]#cat-ntest1这是一个测试文件2welcome3to4here5helloWORLD67linuxcentos6.88redhatsed-e'2,6d'-e's/linuxcentos6.8/LinuxCentos6.8/'test这是一个测试文件LinuxCentos6.8redhat#如果两个命令功能相同,那么需要使用下面的参数sed--expression='s/linuxcentos6.8/LinuxCentos6.8/'--expression='s/to/TO/'test**这是一个测试文件welcomeTOherehelloWORLDLinuxCentTOs6.8redhat6,读写[root@centos001~]#cattest1welcomtohere[root@centos001~]#sed'/here/rtest1'testthisisatestfilewelcometohere#welcomtohere#helloWORLDlinuxcentos6.8redhat#读取test1的文件内容,显示这里所有匹配的行sed-n'/centos6.8/wtest2'test[root@centos001~]#cattest2linuxcentos6.8#将测试文件匹配到centos6.8所有行都写了进入test2文件,该文件可能不存在。#如果文件存在则重定向,而不是追加7,追加插入[root@centos001~]#sed'/^l/a2017-08-08'test2linuxcentos6.82017-08-08#Add2017-08-08[root@centos001~]#sed'1a2017-08-08'test2linuxcentos6.82017-08-08#in在第一行#sed'/^l/后添加2017-08-08[root@centos001~]i2017-08-08'test22017-08-08linuxcentos6.8#在l-08-08开头的匹配行前插入2017#######以上操作不会改变文件内容#################[root@centos001~]#sed-i'/^l/i2017-08-08'test2[root@centos001~]#cattest22017-08-08linuxcentos6.88,其他命令示例[root@centos001~]#cat-ntest212017-08-082linuxcentos6.830845test[root@centos001~]#**sed'/08/{n;升/升/;}'test22017-08-08Linuxcentos6.808test#如果匹配到08,则跳到下一行,将小写的l换成大写,注意第三行也匹配上了#但不满足以下条件,全部不替换[root@centos001~]#sed'1,4y/8/9/'test22017-09-09linuxcentos6.909test#将1到4行的所有数字8替换为9[root@centos001~]#**sed'1q'test2**2017-08-08#打印第一行后退出9.打印奇数或公共偶数行[root@centos001~]#sed-n'p;n'test22017080808[root@centos001~]#sed-n'n;p'test2linuxcentos6.8test[root@centos001~]#sed-n'1~2p'test22017080808[root@centos001~]#sed-n'2~2p'test2linuxcentos6.8test10,打印下一行匹配字符串行[root@centos001~]#sed-n'/linux/{n;p}'test208[root@centos001~]#awk'/linux/{getline;print}'test208Linux三剑客grep命令详细命令名称:grep命令功能:文本搜索或搜索工具详细说明:也可以配合正则表达式搜索文本,打印出匹配的行,也可以用于过滤搜索特定的字符串,使用非常灵活的常用参数:-a#不忽略二进制数据-A#除了显示符合模板样式的行,并显示行后的内容-b#除了显示符合模板样式的行,并显示该行前的内容-B#除了显示符合模板样式的行外,并显示该行前的内容-c#计算次数columnsthatconformsthetemplatestyle-C#除了显示符合模板样式的列外,还显示列前后的内容-d#当指定要查找的目录不是文件时,这个参数一定要用,否则grep命令会报信息并停止动作-e#指定一个字符串作为模板样式查找文件内容-E#使用模板样式作为扩展的普通表达式,意思就是那么可以使用扩展正则expression-f#指定一个模板文件,其内容有一个或多个模板样式,让grep找到满足模板条件的文件内容,格式为each模板样式的列-F#把模板样式当成固定字符串的列表-G#把模板样式当成普通表达式来使用-h#在显示符合模板样式的列之前,不要标记该列列所属的文件名-H#在显示符合模板样式的列之前,标记该列的文件名-i#忽略字符大小写的区别-l#列出符合模板样式的文件内容的文件名到指定的模板样式-L#列出内容不符合指定模板样式的文件名-n#在显示符合模板样式的列之前,标记该列的编号-q#不显示anyinformation-R/-r#这个参数的作用和说明“-drecurse”参数是一样的-s#不显示错误信息-v#反向搜索-V#显示版本信息-w#只显示那些列匹配所有字符-x#只显示匹配所有列的列-y#这个参数作用和"-i"一样-o#只输出文件中正则表达式匹配的部分^#匹配以XX开头的行$#匹配以XX结尾的行常见例子:1、在多个文件中搜索:grep"file"file_1file_2file_32、输出除-v选项外的所有行:grep-v"file"file_name3,标记匹配颜色--color=autooption:grep"file"file_name--color=auto4,useregularExpression-Eoption:grep-E"[1-9]+"egrep"[1-9]+"5.只输出文件中匹配的部分-o选项:回显这是一条测试线。|grep-o-E"[a-z]+."line.echo这是一条测试线。|egrep-o"[a-z]+."line.6,统计文件或文本中包含匹配字符串的行数-c选项:grep-c"text"file_name27,输出包含匹配字符串的行数-n选项:grep"text"-n文件名或cat文件名|grep"text"-n8,multiplefilesgrep"text"-nfile_1file_29,搜索多个文件,查找匹配文本在哪些文件中:grep-l"text"file1file2file3...10,grep递归搜索文件在多级目录中递归搜索文本:grep"text"。-r-n11,忽略匹配模式中的字符大小写:echo"helloworld"|grep-i"HELLO"hello12,option-e指定多个匹配模式:echothisisatextline|grep-e"is"-e"line"-oisline13,也可以使用-f选项匹配多种样式,在样式文件中逐行写出要匹配的字符catpatfileaaabbbechoaaabbbcccdddeee|grep-fpatfile-o14,在grep中搜索结果包含或排除指定文件:只在目录下的所有.php和.html文件中递归搜索字符"main()"grep"main()"。-r--include*.{php,html}15、在ExcludeallREADMEfilesfromsearchresultsgrep"main()"。-r--排除“自述文件”16。从搜索结果中排除filelist文件列表中的文件grep"main()"。-r--exclude-fromfilelistLinuxawk、sed、grep命令三剑客的详解到此结束。欢迎评论、点赞、转发、分享和支持。注:未经授权禁止任何形式的转载。
