当前位置: 首页 > Linux

Linux三大强大工具grep、sed、awk

时间:2023-04-06 18:58:02 Linux

1.grep与正则表达式grepgrep(全局搜索正则表达式(RE)并打印出行,综合搜索正则表达式并打印出行)是一个强大的文本搜索使用正则表达式搜索文本并打印匹配行的工具。Option-d当指定搜索目录而不是文件时必须使用该参数,否则grep命令将报告信息并停止动作。-h搜索多个文件时,不显示匹配的文件名前缀-i忽略字符大小写差异。-l列出其内容与指定模板模式匹配的文件的名称。-n列出所有匹配的文本行,并显示行号-r递归搜索,搜索当前目录及子目录,该参数的作用与指定“-drecurse”参数相同。-v反转查找。只显示不匹配的文本行1.-r递归查找root@siguorui-OptiPlex-7010:/home/xhprof/trunk#grep-rXHProfRuns_Default*examples/sample.php:$xhprof_runs=newXHProfRuns_Default();xhprof_html/callgraph.php:$xhprof_runs_impl=newXHProfRuns_Default();xhprof_html/typeahead.php:$xhprof_runs_impl=newXHProfRuns_Default();2。使用-I,显示文件名root@siguorui-OptiPlex-7010:~#grep-Irootabc.txt123.txtpasswdpasswd:root:x:0:0:root:/root:/bin/bash3。-nroot@siguorui-OptiPlex-7010:~#grep-n'root'passwd1:root:x:0:0:root:/root:/bin/bash正则表达式1.正则表达式单字符特定字符grep'a'passwdcharactergrep'[a-z]'passwdgrep'[A-Za-z0-9]'passwdgrep'[^0-9]'passwd倒置,去掉数字以外的字符。任何字符grep'.'passwd但是在grep'[.]',.只是像点一样表示字符,注意区别。如果要使用.的本义,就用上面三种组合形式的\。2、正则表达式的其他符号边界字符头尾字符^字符,第一个字符,放在一串字母的前面,表示以此开头。grep'^root'passwd$符号,如false$,表示以假字符结尾^$表示空行,grep'^$'passwd元字符w:匹配任何字型字符,包括下划线。等价于([A-Za-z0-9_])W:大写W,匹配任何非单词字符。相当于([^A-Za-z0-9_])b用于分词。例如,grep'\bx\b'passwd可以选取单个前后分隔的x字符,但不会选取单词中出现的x正则表达式字符组合。重复\*:零次或多次以匹配前一个字符或子表达式。示例:grep'se*'test.txt\\+:匹配前一个字符或表达式一次或多次。示例:grep'se\+'test.txt。注意这里加号前要加一个反斜杠?:匹配前面的字符或表达式零次或一次。例如:grep'se\?'测试.txt。笔记?使用反斜杠括号也要在前面加上:grep'\(se\)*'test.txt。注意括号前必须加反斜杠指定重复次数:grep'[0-9]\{2,3\}'passwd2.sed行编辑器sed是流编辑器,在文本中很重要processing工具可以和正则表达式完美配合使用,功能非凡。处理时,将当前处理的行存储在一个临时缓冲区中,这个缓冲区称为“模式空间”,然后用sed命令对缓冲区中的内容进行处理。处理完成后,将缓冲区的内容发送到屏幕。然后处理下一行,重复直到文件结束。除非您使用重定向存储输出,否则文件内容不会更改。sed主要用于自动编辑一个或多个文件;简化对文件的重复操作;编写转换程序等命令格式sed[options]'command'file(s)sed[options]-fscriptfilefile(s)optionscommonoptions-e:toprocesswith选项输入文本文件中指定的脚本;-n或--quiet或--silent:只显示脚本处理后的结果;命令常用a\在当前行下方插入文本。i\在当前行上方插入文本。c\将所选行更改为新文本。dDelete,删除选中的行。n读取下一个输入行,用下一个命令而不是第一个命令处理新行。s替换指定的字符p打印模板块的行。q退出sed。rfile从文件中读取行。wfile写入模板块并将其附加到文件末尾。1.p打印相关行nlpasswd|sed-n'10p'//打印第10行的内容sed-n'p'passwdsed-n'/root/p'passwd//正则匹配printnlpasswd|sed-n'10,20p'//打印第10到20行nlpasswd|sed-n'/news/,/nobody/p'//用正则指定一行的范围nlpasswd|sed-n'10,20!p'//不要选择10到20行,!standsforinversionnlpasswd|sed-n'1~2p'//间隔行,会输出1,3,5....line注意,这里一定要加上-n选项,否则每条数据都会显示同样的2行。2.a在root@siguorui-OptiPlex-7010:~#nlpasswd|sed'2a***************'1root:x:0:0:root这行之后添加内容:/root:/bin/bash2守护进程:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin**************3bin:x:2:2:bin:/bin:/usr/sbin/nologinnlpasswd|sed'1,2a***************'//inrange每行后插入3我插入root@siguorui-OptiPlex-7010:~#nlpasswd|sed'1.2i***************'***************1root:x:0:0:root:/root:/bin/bash**************2daemon:x:1:1:daemon:/usr/sbin:/root@siguorui-OptiPlex-7010:~#nlpasswd|sed'1cabcd'abcd2daemon:x:1:1:daemon:/usr/sbin:/usrroot@siguorui-OptiPlex-7010:~#nlpasswd|sed'1,//sbin/nologin//sbin/nologin///sbin/nologin///sbin/nologin/sbin/nologin/sbin/nologin/sbin/nologin///sbin/nologin/sbin/nologin3cabcd'abcd4sys:x:3:3:sys:/dev:/usr/sbin/nologin5.d删除行root@siguorui-OptiPlex-7010:~#nlpasswd|sed'/root/d'2daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin3bin:x:2:2:bin:/bin:/usr/sbin/nologin应用程序案件示例在文件末尾插入2行nlpasswd|sed'$a\abcd\nlinux'49memcache:x:126:132:Memcached,,,:/nonexistent:/bin/false50postfix:x:127:133::/var/spool/postfix:/bin/false51mongodb:x:128:65534::/var/lib/mongodb:/bin/falseabcdlinux删除文件中的空行,^$直接连接代表空行nlpasswd|sed'/^$/d'6.s替换命令sed's/false/true/'passwd输出:...sphinxsearch:x:124:131::/home/sphinxsearch:/bin/truesshd:x:125:65534::/var/run/sshd:/usr/sbin/nologinmemcache:x:126:132:Memcached,,,:/不存在:/bin/truepostfix:x:127:133::/var/spool/postfix:/bin/truesed's/:/%/g'passwd//将g添加到全局替换输出:sphinxsearch%x%124%131%%/home/sphinxsearch%/bin/falsesshd%x%125%65534%%/var/run/sshd%/usr/sbin/nologinmemcache%x%126%132%Memcached,,,%/nonexistent%/bin/falsepostfix%x%127%133%%/var/spool/postfix%/bin/falsefilteripeno1链接在ifconfig中封装:以太网硬件地址f8:b1:56:c5:e7:44inet地址:172.19.5.175广播:172.19.5.255掩码:255.255.255.0inet6地址:fe80::c422:e82d:ad66:7a92/64范围:链接向上广播运行多播MTU:1500跳数:1接收数据包:35171885错误:53864丢弃:0过载:0帧:29047发送数据包:25049325错误:0丢弃:0过载:0运营商:0冲突:0发送队列长度:1000接收字节:8124495140(8.1GB)发送字节:4549284803(4.5GB)中断:20内存:f7f00000-f7f20000ifconfigeno1|sed-n'/inet/p'|sed's/inet.*address://'|sed's/broadcast.*$//'输出:172.19.5.175进阶操作命令1.多个sed命令,用{}包裹,用';'分隔删除第44-48行,并将false替换为truenlpasswd|sed'{44,48d;s/false/true/}'41statd:x:121:65534::/var/lib/nfs:/bin/true42mysql:x:1001:1001::/home/mysql:/sbin/nologin43www:x:1002:1002::/home/www:/sbin/nologin49memcache:x:126:132:Memcached,,,:/不存在:/bin/true50postfix:x:127:133::/var/spool/postfix:/bin/true51mongodb:x:128:65534::/var/lib/mongodb:/bin/true2.n读取下一个输入行//nusageroot@siguorui-OptiPlex-7010:~#nlpasswd|sed-n'{p;n}'1root:x:0:0:root:/root:/bin/bash3bin:x:2:2:bin:/bin:/usr/sbin/nologin5sync:x:4:65534:sync:/bin:/bin/sync7man:x:6:12:man:/var/cache/man:/usr/sbin/nologin提示:nlpasswd|sed-n'{1~2p}'前面说了~也可以达到同样的效果3.&替换固定字符串,&代表前面匹配的字符//名字和后面的内容用空格隔开root@siguorui-OptiPlex-7010:~#sed's/^[a-z_]\+/&/'passwdroot:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologin//用户名首字母转大写//元字符\u\l(首字母大小写转换)\U\L(一串字符大小写转换),转换为大小写字符//小写u,替换用户名首字母root@siguorui-OptiPlex-7010:~#sed's/^[a-z_]\+/\u&/'passwdRoot:x:0:0:root:/root:/bin/bashDaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinBin:x:2:2:bin:/bin:/usr/sbin/nologin//大写U,将所有用户名替换为大写root@siguorui-OptiPlex-7010:~#sed's/^[a-z_]\+/\U&/'passwdROOT:x:0:0:root:/root:/bin/bashDAEMON:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinBIN:x:2:2:bin:/bin:/usr/sbin/nologin4。Useof()//从passwd文件中提取username、uid、gid。\1,\2,\3表示前面的()匹配字符root@siguorui-OptiPlex-7010:~#sed's/\(^[a-z_-]\+\):x:\([0-9]\+\):\([0-9]\+\):.*$/USER:\1UID:\2GID:\3/'passwdUSER:rootUID:0GID:0USER:daemonUID:1GID:1USER:binUID:2GID:2USER:sysUID:3GID:3USER:syncUID:4GID:655345。-r复制指定文件并插入到匹配行-w复制匹配行并复制到指定文件//123.txt文件中有3行,都是数字。abc.txt文件一共有3行,都是字母//下面命令的实现结果,读取123.txt的内容,复制到匹配的abc.txt文件的第一行,得到文件内容不变root@siguorui-OptiPlex-7010:~#sed'1r123.txt'abc.txtqwefadssa12323232233234343423333trwrdaasdfasdf//下面命令的执行结果匹配abc.txt文件第二行写入123.txt文件。123.txt文件会发生变化,但abc.txt文件的内容将保持不变。//sed'2wor2rfileA'的总结,B文件匹配到的文件都是针对B文件的,读或者写都是针对A文件的。6.q找到指定结果后提前退出root@siguorui-OptiPlex-7010:~#nlpasswd|sed'2q'1root:x:0:0:root:/root:/bin/bash2daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinroot@siguorui-OptiPlex-7010:~#nlpasswd|sed'/root/q'1root:x:0:0:root:/root:/bin/bashroot@siguorui-OptiPlex-7010:~#7,sed批量替换多个文件内容,加上-i参数,文件内容才会真正改变,如果不加,只输出替换后的结果,文件内容不会改变格式:sed-i"s/searchfield/replacefield/g"`grepsearchfield-rlpath`例子:sed-i"s/oldstring/newstring/g"`grepoldstring-rlyourdir`sed-i"s/English/China/"`lstest*`3.awkAWK是一种操作文本文件的语言,是一个强大的文本分析工具。具有操作灵活、功能强大的特点。可实现统计、制表等功能。之所以叫AWK,是因为它取了三位创始人AlfredAho、PeterWeinberger和BrianKernighan姓氏的首字母。Formatcommandlineformatawk[options]'command'file(s)scriptformatawk-fawk-script-filefile(s)命令格式:awk[-F|-f|-v]'BEGIN{}//{命令1;command2}END{}'file[-F|-f|-v]大参数,-F指定分隔符,-f调用脚本,-v定义变量var=value''参考代码块BEGIN初始化代码块,在处理每一行之前,初始化代码,主要引用全局变量,并设置FS分隔符//匹配代码块,可以是字符串或正则表达式{}命令代码块,包含一条或多条命令;multiple命令使用分号分隔末尾的END代码块。代码块在每一行处理完之后执行,主要用于最后的计算或者输出结束汇总信息。常用内置参数$0,$1,$2...表示整个当前行$1每行第一个字段NF字段数变量NR每行记录数,多文件记录递增FILENAME文件名1.常用的内置参数,$1,$2....用分隔符指定,顺序为$1,$2....默认分隔符是空格awk-F':''{print"USERNAE:"$1"\t""UID:"$3}'passwd2.NR,NF,FILENAMEawk-F':''{print"Line:"NR,"Col:"NF,"USER:"$1}'passwd3.使用printf指定的格式打印awk-F':''{printf("Line:%3sCol:%sUser:%s\n",NR,NF,$1)}'passwdroot@siguorui-OptiPlex-7010:~#awk-F':''{printf("Line:%3sCol:%sUser:%s\n",NR,NF,$1)}'passwdLine:1Col:7User:rootLine:2Col:7User:daemonLine:3Col:7User:binLine:4Col:7User:sys...4.使用ifawk-F':''{if($3>100)printf("Line:%3sCol:%sUser:%s\n",NR,NF,$1)}'passwd5.结合使用awk-F':''/root使用正则表达式和命令/{print$1}'passwdroot@siguorui-OptiPlex-7010:~#awk-F':''/root/{print$1}'passwdroot6.使用BEGIN和END选项卡awk-F':''BEGIN{print"linecoluser"}{printNR"|"NF"|"$1}END{print"----------------"FILENAME}'passwd7.使用BEGIN和END统计目录下文件的总大小ls-l|awk'BEGIN{size=0}{size+=$5}END{print"sizeis"size/1024/1024"M"}'8.统计passwdnumber中的非空行。$1!~,~代表匹配后面的正则模式,!~代表不匹配。/^$/正则匹配空行awk-F':''BEGIN{count=0}$1!~/^$/{count++}END{print"count="count}'passwd9.将统计结果放入数组,并打印出来awk-F':''BEGIN{count=0}{if($3>100)name[count++]=$1}END{for(i=0;i100)name[count++]=$1}END{for(i=0;i