匹配行linux中grep命令的使用
最近个人几篇文章介绍了改匹配行的文章. 关联文章的地址
linux中grep命令的用使
    grep (global search regular expression(RE) and print out the line,全面搜索正则抒发式并把行印打出来)是一种壮大的文本搜索具工,它能用使正则抒发式搜索文本,并把匹配的行印打出来。Unix的grep族家包含grep、egrep和fgrep。
  
 grep命令是一种壮大的文本搜索具工,它能用使正则抒发式搜索文本,并把匹 配的行印打出来。grep全称是Global Regular Expression Print,示表全局正则抒发式版本,它的用使限权是全部用户。ps -ef | grep httpd  :检查httpd进程否是存在
ps -aux |awk '$2~/32651/'滤过可以用ps -aux |awk '$2!~/32651/' grep 2567会示显涌现2567这个字符串的全部行 ; | 这是一个管道,把输出的结果作当输入送给下一个命令。
awk和sed比grep壮大多了,在讲unix的书上grep一般是略带提的,但awk和sed就会着重讲。
找查etc录目下含有字符串“wl0505”的件文:find /etc -name "*" |xargs grep "wl0505" > ~/thefile
grep -rn wl0505 /etc/*
find / -name "*.*" | xargs grep "wl0505" >>/home/filename*.*是件文名和扩展名,>>是把结果重定向到面后径路的件文中去,不在终端上示显了。
"*" 示表匹配带*这个字符的行* 示表 找出带有*的件文 并印打行 find ./ -maxdepth 1 | grep "*"find ./ -maxdepth 1 | grep \*这两个命令才是等价的 对于 grep来讲 他只受接正则抒发式匹配 * ? 这些字符须要加转义符 \
linux下的find与grep命令的功能不同。find 命令用于从录目树中找查与搜索条件匹配的件文;grep 命令用于找查输入流中包含模板文本的行。find 命令常结合grep命令用使, 以对搜索结果做进一步的筛选
匹配录目/cpl下全部(递归找查)以'#'扫尾的件文:
    OCS101:~/cpl # grep -r '^#' .
 ./fk.c:#include<stdio.h>
 ./fk.c:#include<math.h>
 ./flower2.c:#include <stdio.h>
 ./flower2.c:#include <time.h>
 ./recursive_flower.c:#include<stdio.h>
 ./recursive_flower.c:#include <stdlib.h>
 ./recursive_flower.c:#include <time.h>
 ./recursive_flower.c:#define m 8
 ./flower.c:#include <stdio.h>
 ./flower.c:#include <stdlib.h>
 ./flower.c:#include <time.h>
 ./flower.c:#define N 1e8
匹配录目/cpl下全部(递归找查)以'}'尾结的件文:
    OCS101:~/cpl # grep -r '^}' .
 ./fk.c:}
 ./fk.c:}
 ./fk.c:}
 ./Narcissus.java:} 
 ./flower2.c:}
 ./flower2.c:}
 ./flower2.c:}
 ./recursive_flower.c:}
 ./recursive_flower.c:}
 ./recursive_flower.c:}
 ./recursive_flower.c:}
 ./flower.c:}
 ./flower.c:}
 ./flower.c:}
 ./flower.c:}
 ./flower.c:}
    
 抒发符集
 ^
 定锚行的开始 如:'^grep'匹配全部以grep扫尾的行。
 $
 定锚行的束结 如:'grep$'匹配全部以grep尾结的行。
 .
 匹配一个非换行符的字符如:'gr.p'匹配gr后接一个意任字符,然后是p。
 *
 匹配零个或多个先前字符 如:' *grep' (意注*前有空格)匹配全部零个或多个空格后紧跟grep的行,须要用egrep 或者grep带上 -E 选项。 .*一升引代表意任字符。
 []
 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
 [^]
 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-F和H-Z的一个字母扫尾,紧跟rep的行。
 \(..\)
 记标匹配字符,如'\(love\)',love被记标为1。
 \<
 定锚单词的开始,如:'\<grep'匹配包含以grep扫尾的单词的行。
 \>
 定锚单词的束结,如'grep\>'匹配包含以grep尾结的单词的行。
 x\{m\}
 重复字符x,m次,如:'o\{5\}'匹配包含5个o的行。
 x\{m,\}
 重复字符x,最少m次,如:'o\{5,\}'匹配最少有5个o的行。
 x\{m,n\}
 重复字符x,最少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
 \w
 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
 \W
 \w的反置式形,匹配一个或多个非单词字符,如点号句号等。
 \b
 单词锁定符,如: '\bgrep\b'只匹配grep。[1]用于egrep和 grep -E的元字符扩展集
 +
 匹配一个或多个先前的字符。如:'[a-z]+able',匹配一个或多个小写字母后跟able的串,如loveable,enable,disable等。
 ?
 匹配零个或一个先前的字符。如:'gr?p'匹配gr后跟一个或没有字符,然后是p的行。
 a|b|c
 匹配a或b或c。如:grep|sed匹配grep或sed
 ()
 组分号符,如:love(able|rs)ov+匹配loveable或lovers,匹配一个或多个ov。
 x{m},x{m,},x{m,n}
 作用同x\{m\},x\{m,\},x\{m,n\}
 POSIX字符类
 为了在不同国度的字符编码中持保一至,POSIX(The Portable Operating System Interface)增加了特别的字符类,如[:alnum:]是A-Za-z0-9的另一个写法。要把它们放到[]号内才能成为正则抒发式,如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支撑POSIX的字符类。
 [:alnum:]
 文字数字字符
 [:alpha:]
 文字字符
 [:digit:]
 数字字符
 [:graph:]
 非空字符(非空格、控制字符)
 [:lower:]
 小写字符
 [:cntrl:]
 控制字符
 [:print:]
 非空字符(包含空格)
 [:punct:]
 标点号符
 [:space:]
 全部空白字符(新行,空格,制表符)
 [:upper:]
 大写字符
 [:xdigit:]
 十六进制数字(0-9,a-f,A-F)
 命令选项
 -?
 同时示显匹配行上下的?行,如:grep -2 pattern filename同时示显匹配行的上下2行。
 -a, --text
 等价于匹配text,用于(Binary file (standard input) matches)报错
 -b,--byte-offset
 印打匹配行面前印打该行在所的块码号。
 -c,--count
 只印打匹配的行数,不示显匹配的内容。
 -f File,--file=File
 从件文中取提模板。空件文中包含0个模板,所以什么都不匹配。
 -h,--no-filename
 当搜索多个件文时,不示显匹配件文名前缀。
 -i,--ignore-case
 略忽大小写差异。
 -q,--quiet
 取消示显,只回返退出状态。0则示表找到了匹配的行。
 -l,--files-with-matches
 印打匹配模板的件文清单。
 -L,--files-without-match
 印打不匹配模板的件文清单。
 -n,--line-number
 在匹配的行面前印打行号。
 -s,--silent
 不示显关于不存在或者法无取读件文的错误信息。
 -v,--revert-match
 反检索,只示显不匹配的行。
 -w,--word-regexp
 如果被\<和\>引用,就把抒发式做为一个单词搜索。
 -R, -r, --recursive
 递归的取读录目下的全部件文,包含子录目。 比如grep -R 'pattern' test会在 test 及其子录目下的全部件文中,匹配 pattern。
 -V,--version
 示显软件版本信息。
 实例
 要用好grep这个具工,其实就是要写好正则抒发式,所以这里不对grep的全部功能停止实例解讲,只列几个例子,解讲一个正则抒发式的写法。
 $ ls -l | grep '^a'
 通过管道滤过ls -l输出的内容,只示显以a扫尾的行。
 $ grep 'test' d*
 示显全部以d扫尾的件文中包含test的行。
 $ grep 'test' aa bb cc
 示显在aa,bb,cc件文中匹配test的行。
 $ grep '[a-z]\{5\}' aa
 示显全部包含每一个字符串有5个续连小写字符的字符串的行。
 $ grep 'w\(es\)t.*\1' aa
 如果west被匹配,则es就被存储到内存中,并记标为1,然后搜索意任个字符(.*),这些字符面后紧跟着另外一个es(\1),找到就示显该行。如果用egrep或grep -E,就不必"\"号停止转义,直接写成'w(es)t.*\1'以可就了。
 意注
 在某些呆板上,要用使-E参数才能够停止逻辑匹配(详见下)
 grep "a|b" (匹配包含字符款式为"a|b"的行)
 grep -E "a|b" (匹配包含字符款式为"a"或"b"的行)
 man grep面里关于-E参数的说明是
 -E
 Treats each pattern specified as an extended regular expression (ERE). A NULL value for the ERE matches every
 line.
 Note: The grep command with the -E flag is the same as the egrep command, except that error and usage messages
 are different and the -s flag functions differently.
 拓展命令
 egrep 命令,搜索件文得获模式。
 egrep 命令会在输入件文(缺省值为标准输入)中搜索与用 Pattern 参数指定的模式相匹配的行。这些模式是整完的正则抒发式就像在 ed 命令中的那样(除了 \ (反斜杠)和 \\ (双反斜杠))。以下规矩也应用于 egrep 命令:
 * 一个正则抒发式面后带一个 + (加号)会匹配一个或多个的正则抒发式。
 * 一个正则抒发式面后带一个 ? (问号)会匹配零个或一个该正则抒发式。
 * 由 | (竖线)或者换行符隔开的多个正则抒发式会匹配与任何一个正则抒发式所匹配的字符串。
 * 一个正则抒发式可以被包含在“()”(括弧)中停止组分。
 换行符将不会被正则抒发式匹配。
 运算符的优先顺序是 [, ], *, ?, +, 合并, | 和换行符。
 意注: egrep 命令与 grep 命令带 -E 标志是一样的,除了错误消息和用使消息不同以及 -s 标志的功能不同之外。
 egrep 命令会示显包含该匹配行的件文,如果您指定了多于一个 File 参数的话。
 对 shell 有特别含义的字符($, *, [, |, ^, (, ), \ ) 涌现在 Pattern 参数中时必须带双引号。如果 Pattern 参数不是简单字符串,通常必须用单引号将整个模式括起来。在抒发式中比如 [a-z],减号示表通过当前整理序列。整理序列可以定义等价的类以供在字符范围中用使。它用使了快速确定性的算法,有时须要外部空间。[2]fgrep命令, 为件文搜索文字字符串。
 fgrep命令搜索 File 参数指定的输入件文(缺省为标准输入)中的匹配模式的行。fgrep命令特别搜索 Pattern 参数,它们是固定的字符串。如果在 File 参数中指定一个以上的件文fgrep命令将示显包含匹配行的件文。
 fgrep命令于 grep 和 egrep 命令不同,因为它搜索字符串而不是搜索匹配抒发式的模式。fgrep命令用使快速的压缩算法。$, *, [, |, (, ) 和 \ 等字符串被fgrep命令按字面意思解释。这些字符并不解释为正则抒发式,但它们在 grep 和 egrep 命令中解释为正则抒发式。
 因为这些字符对于 shell 有特定的含义,整完的字符串应该加上单引号(‘ ... ’)。
 如果没有指定件文,fgrep命令假定标准输入。一般,找到的每行都复制到标准输出中去。如果不止一个输入件文,则在找到的每行前印打件文名。
文章结束给大家分享下程序员的一些笑话语录: 
自行车
    一个程序员骑着一个很漂亮的自行车到了公司,另一个程序员看到了他,问 到,“你是从哪搞到的这么漂亮的车的?”
    骑车的那个程序员说, “我刚从那边过来, 有一个漂亮的姑娘骑着这个车过来, 并停在我跟前,把衣服全脱了,然后对我说,‘你想要什么都可以’”。
    另一个程序员马上说到, “你绝对做了一个正确的选择, 因为那姑娘的衣服你 并不一定穿得了”。
 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号