当前位置: 首页 > Linux

Linux基本命令介绍5:文本过滤grep

时间:2023-04-06 11:19:46 Linux

在Linux中经常需要过滤文本或者输出内容。最常用的过滤命令是grepgrep[OPTIONS]PATTERN[FILE...]grep逐行检索输入的每一行,如果输入行包含模式PATTERN,则输出这一行。这里的PATTERN是正则表达式(参考上一篇文章,本文结合grep结合实例)。在文件/etc/passwd中输出包含root的行:[root@centos7temp]#greproot/etc/passwdroot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin或从标准输入:[root@centos7temp]#cat/etc/passwd|greprootroot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin需要注意的是:当grep的输入同时来自于文件和标准输入,grep会忽略标准输入的内容,不做处理,除非用符号-来表示标准输入:[root@centos7temp]#cat/etc/passwd|greproot/etc/passwd-/etc/passwd:root:x:0:0:root:/root:/bin/bash/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin(标准输入):root:x:0:0:root:/root:/bin/bash(标准输入):operator:x:11:0:operator:/root:/sbin/nologin此时,grep将指示哪些结果来自文件,哪些来自标准输入。在文件/etc/passwd和文件/etc/group中输出以root开头的行:[root@centos7temp]#grep"^root"/etc/passwd/etc/group/etc/passwd:root:x:0:0:root:/root:/bin/bash/etc/group:root:x:0:输出文件/etc/passwd中以/bin/bash结尾的行:[root@centos7temp]#grep"/bin/bash$"/etc/passwdroot:x:0:0:root:/root:/bin/bashlearner:x:1000:1000::/home/learner:/bin/bash注意PATTERN在上面两个例子引用是为了防止被shell解析。输出文件/etc/passwd中不以a-s中的任何字母开头的行:[root@centos7temp]#grep"^[^a-s]"/etc/passwdtss:x:59:59:Accountusedbytcsddaemon:/dev/null:/sbin/nologintcpdump:x:72:72::/:/sbin/nologinsandboxpackagetosandbox这里需要理解两者的不同含义^,第一个^表示行首,第二个[]里面的两个第一个字符^代表否定。输出文件/etc/passwd中字符0连续出现3次或以上的行(注意转义字符'\'):[root@centos7temp]#grep"0\{3,\}"/etc/passwdlearner:x:1000:1000::/home/learner:/bin/bash例如,输出文件/etc/passwd以字符r或l开头:[root@centos7temp]#grep"^[rl]"/etc/passwdroot:x:0:0:root:/root:/bin/bashlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinlearner:x:1000:1000::/home/learner:/bin/bash选项-i使grep在匹配模式时忽略大小写:[root@centos7temp]#grep-iabcdfileABCDfunctionabcd(){[root@centos7temp]#Option-o表示只输出匹配的字符,而不是整行:[root@centos7temp]#grep-oiabcdfileABCDabcd[root@centos7temp]#Option-c统计匹配行数:[root@centos7temp]#grep-oicabcdfile2[root@centos7temp]#option-v表示反向匹配,比如输出/etc/passwd中不以/sbin/nologin结尾的行:[root@centos7temp]#grep-v"/sbin/nologin$"/etc/passwdroot:x:0:0:root:/root:/bin/bashsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltlearner:x:1000:1000::/home/learner:/bin/bash选项-fFILE表示使用文件FILE作为模式匹配:[root@centos7temp]#cattestabcdABCD[root@centos7temp]#grep-ftestfileABCDfunctionabcd(){[root@centos7temp]#option-x表示匹配整行:[root@centos7temp]#grep-xftestfileABCD[root@centos7temp]#option-w表示整词匹配:[root@centos7temp]#grepherefileherethere[root@centos7temp]#grep-wherefilehere[root@centos7temp]#option-h表示文件多时不输出文件名:[root@centos7temp]#cat/etc/passwd|grep^root-/etc/passwd-hroot:x:0:0:root:/root:/bin/bashroot:x:0:0:root:/root:/bin/bash选项-n表示显示行号:[root@centos7temp]#grep-n"^[rl]"/etc/passwd1:root:x:0:0:root:/root:/bin/bash5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin24:learner:x:1000:1000::/home/learner:/bin/bash选项-AN,-BN,-CN表示输出匹配行及其‘周围行’-AN表示输出匹配行及其后N行-BN表示输出匹配行及其前N行(before)-CN表示输出匹配行及它前后的N行[root@centos7temp]#grep-A2^operator/etc/passwdoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP用户:/var/ftp:/sbin/nologin[root@centos7temp]#grep-B2^operator/etc/passwdhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologin[root@centos7temp]#grep-C1^operator/etc/passwdmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologin选项-F将PATTERN视为其字面意义匹配(忽略字符的特殊含义),相当于执行命令fgrep:[root@centos7temp]#grep-F^root/etc/passwd[root@centos7temp]#命令没有输出选项-E可以使用扩展正则表达式,就像执行egrep命令一样:[root@centos7temp]#egrep"^root|^learner"/etc/passwdroot:x:0:0:root:/root:/bin/bashlearner:x:1000:1000::/home/learner:/bin/bash使用扩展的正则表达式意味着可以不转义地表达字符的特殊含义,包括?,+,{,|,(and)选项-P表示使用perl的正则表达式进行匹配,如:[root@centos7~]#echo"helloworld123456"|grep-oP"\d+"123456[root@centos7~]#perlregular"\d"表示数字,+表示匹配一次或多次(与vim相同)。选项-a将二进制文件视为文本文件:[root@centos7~]#grep-aonline/usr/bin/ls%s在线帮助:<%s>[root@centos7~]#option--exclude=GLOB和--include=GLOB表示排除和包含匹配GLOB的文件,GLOB表示通配符(find和xargs的用法见基本命令介绍3):[root@centos7temp]#find.-类型f|xargsgrep--exclude=*.txt--include=test*bash./test.sh:#!/bin/bash[root@centos7temp]#grep强大的过滤能力来自于各种选项和正则表达式的配合,在以后的文章中还有更多的例子。