当前位置: 首页 > 科技观察

快速掌握grep命令和正则表达式

时间:2023-03-17 11:17:20 科技观察

Linux系统自带GNU版grep工具,支持扩展正则表达式。所有Linux发行版都默认安装grep。grep命令用于检索任意位置的Text信息,如何在Linux系统和类Unix操作系统中使用带正则表达式的grep命令?快速理解正则表达式1、如何匹配你要找的东西?正则表达式无非就是每个输入行所匹配的模式。在“/etc/passwd”中检索“vivek”。grepvivek/etc/passwd输出结果示例:vivek:x:1000:1000:VivekGite,,,:/home/vivek:/bin/bashvivekgite:x:1001:1001::/home/vivekgite:/bin/shgitevivek:x:1002:1002::/home/gitevivek:/bin/sh在所有情况下搜索“vivek”(即不区分大小写):grep-i-wvivek/etc/passwd检索“vivek”和“raj”:grep-E-i-w'vivek|raj'/etc/passwd在上一个示例中,使用了扩展正则表达式模式。固定搜索位置:您可以使用^和$符号强制正则表达式分别匹配行的开头或结尾。下面的示例显示以“vivek”开头的文本。grep^vivek/etc/passwd的示例输出:vivek:x:1000:1000:VivekGite,,,:/home/vivek:/bin/bashvivekgite:x:1001:1001::/home/vivekgite:/bin/sh您可以只显示以vivek开头的文本行。例如,不显示以vivekgite和vivekg开头的单词。grep-w^vivek/etc/passwd检索以'foo'结尾的文本格式:grep'foo$'FILENAME也可以通过以下方式搜索空行:grep'^$'FILENAME2.如何匹配特定字符?匹配'Vivek'或'vivek':grep'[vV]ivek'FILENAME或此:grep'[vV][iI][Vv][Ee][kK]'FILENAME你可以匹配数字(例如匹配vivek1或Vivek2):grep-w'[vV]ivek[0-9]'FILENAME你可以匹配两个数字(例如匹配foo11,foo12):grep'foo[0-9][0-9]'FILENAME不仅仅是数字,您可以匹配字母:grep'[A-Za-z]'FILENAME显示包含“w”或“n”字母的所有文本行:grep[wn]FILENAME表达式中的括号括起来,在“[:”和The包含在“:]”中的字符类的名称:表示属于该类的所有字符的列表。标准字符类名称:[:alnum:]–字母数字字符。[:alpha:]–字母顺序[:blank:]–空格和制表符。[:digit:]–数字:'0123456789'。[:lower:]–小写字母:'abcdef'。[:space:]–特殊字符:制表符、换行符、垂直制表符、换页符、回车符和空格。[:upper:]–大写字母:'ABCDEFGHIJKLMNOPQRSTUVWXYZ'。在下面的例子中,匹配的都是大写字母:grep'[:upper:]'FILENAME3,如何使用通配符?您可以使用”。”替换单个字符。在下面的示例中,查询了所有以字母“b”开头并以字母“t”结尾的三字符单词。grep'\'FILENAME上例中:\<匹配单词开头的空格字符串\>匹配单词结尾的空格字符串检索并输出所有两个字母的结果:grep'^..$'FILENAME检索并显示所有以'.'开头的结果和一个数字:grep'^\.[0-9]'FILENAMEescapecharacter'.'以下正则表达式查找到IP地址192.168.1.254,不会获取到预期结果:grep'192.168.1.254'/etc/hosts其中三个点需要转义:grep'192\.168\.1\.254'/etc/hosts下面的例子将只匹配一个地址:egrep'[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]以下{1,3}'FILENAME将匹配单词Linux或Unix,无论大小写:egrep-i'^(linux|unix)'FILENAME深入grep高级搜索模式探索1.如何检索以'-'开头的文件?使用-e选项搜索与“--test-”匹配的所有结果。grep会尝试解析'--test--'作为一个选项:grep-e'--test--'FILENAME2,如何在grep中使用OR的逻辑运算?grep-E'word1|word2'FILENAME###OR###egrep'word1|word2'FILENAMEorgrep'word1\|word2'FILENAME3,如何在grep中使用AND的逻辑运算?根据以下语法显示所有包含单词'word1'和'word2'的结果:grep'word1'FILENAME|grep'word2'或者可以像这样:grep'foo.*bar\|word3.*word4'FILENAME4,如何测试序列?您可以使用以下语法来测试序列中字符的重复次数:{N}{N,}{min,max}匹配包含两个字母v的字符串结果:egrep"v{2}"FILENAME如下示例将检索文件中包含“col”和“cool”的字符String结果:egrep'co{1,2}l'FILENAME下面的示例将匹配包含至少3个字母c的结果:egrep'c{3,}'FILENAME下面的例子会匹配“91-1234567890”格式的手机号码(即“两位数-十位数字”)grep"[[:digit:]]\{2\}[-]\?[[:digit:]]\{10\}"FILENAME5,如何使用高亮grep的输出?使用下面例子的语法:grep--colorregexFILENAME6.如何让grep的输出只显示匹配的部分而不是整行?使用以下示例的语法:grep-oregexFILENAME正则表达式运算符总结了正则表达式:运算符含义匹配任何单个字符。?匹配前一个字符0次或1次。*匹配前一个字符≥0次。+匹配前一个字符≥1次。{N}匹配前一个字符N次。{N,}匹配前一个字符≥m次。{N,M}匹配前一个字符N到M次。–如果在列表中的列表中或在范围的终点,请指明范围。^开始标签表示在开始位置匹配一个空字符串。也表示不在列表范围内的字符。$结束标记。匹配一个空字符串。\b单词储物柜。匹配单词边缘的空字符串。\B匹配单词非边缘位置的空字符串。\<匹配单词开头的空字符串。\>匹配单词末尾的空字符串。关于grep和egrepegrep,或grep-E,将模式解释为扩展的正则表达式。grep帮助文档定义如下:基本正则表达式元字符?、+、{、|、(、和)失去了它们的特殊含义;而是使用反斜杠版本\?、\+、\{、\|、\(、和\)。传统的grep不支持{元-character,andsomeegrepimplementationssupport\{instead,soportablescriptsshouldavoid{ingrep-Epatternsandshoulduse[{]tomatchaliteral{.GNUgrep-Eattemptstosupporttraditionalusagebyassumingthat{isnotspecialifitwouldbethestartofaninvalidintervalspecification.Forexample,thecommandgrep-E'{1'searchesforthetwo-characterstring{1insteadofreportingasyntaxerrorintheregularexpression.POSIX.2allowsthisbehaviorasanextension,butportablescriptsshouldavoidit.