zoukankan      html  css  js  c++  java
  • Linux grep命令

    首先声明:本文是转载文章http://www.cnblogs.com/end/archive/2012/02/21/2360965.html

    1.作用
    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

    2.格式
    grep [options]

    3.主要参数
    [options]主要参数:
    -c:只输出匹配行的计数。
    -I:不区分大 小写(只适用于单字符)。
    -h:查询多文件时不显示文件名。
    -l:查询多文件时只输出包含匹配字符的文件名。
    -n:显示匹配行及 行号。
    -s:不显示不存在或无匹配文本的错误信息。
    -v:显示不包含匹配文本的所有行。
    pattern正则表达式主要参数:
    : 忽略正则表达式中特殊字符的原有含义。
    ^:匹配正则表达式的开始行。
    $: 匹配正则表达式的结束行。
    <:从匹配正则表达 式的行开始。
    >:到匹配正则表达式的行结束。
    [ ]:单个字符,如[A]即A符合要求 。
    [ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
    。:所有的单个字符。
    * :有字符,长度可以为0。

    4.grep命令使用简单实例

    1、或操作

     grep -E '123|abc' filename  // 找出文件(filename)中包含123或者包含abc的行
      egrep '123|abc' filename    // egrep同样可以实现
      awk '/123|abc/' filename   // awk 的实现方式

    2、与操作

     grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。

    3、其他操作

    grep -i pattern files :不区分大小写地搜索。默认情况区分大小写,
    grep -l pattern files :只列出匹配的文件名,
    grep -L pattern files :列出不匹配的文件名,
    grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配‘magic’,而不是‘magical’),

    grep -C number pattern files :匹配的上下文分别显示[number]

    $ 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′就可以了。

    5.grep命令使用复杂实例
    假设您正在’/usr/src/Linux/Doc’目录下搜索带字符 串’magic’的文件:
    $ grep magic /usr/src/Linux/Doc/*
    sysrq.txt:* How do I enable the magic SysRQ key?
    sysrq.txt:* How do I use the magic SysRQ key?
    其中文件’sysrp.txt’包含该字符串,讨论的是 SysRQ 的功能。
    默认情况下,’grep’只搜索当前目录。如果 此目录下有许多子目录,’grep’会以如下形式列出:
    grep: sound: Is a directory
    这可能会使’grep’ 的输出难于阅读。这里有两种解决的办法:
    明确要求搜索子目录:grep -r
    或忽略子目录:grep -d skip
    如果有很多 输出时,您可以通过管道将其转到’less’上阅读:
    $ grep magic /usr/src/Linux/Documentation/* | less
    这样,您就可以更方便地阅读。

    有一点要注意,您必需提供一个文件过滤方式(搜索全部文件的话用 *)。如果您忘了,’grep’会一直等着,直到该程序被中断。如果您遇到了这样的情况,按 <CTRL c> ,然后再试。

    下面还有一些有意思的命令行参数:
    grep -i pattern files :不区分大小写地搜索。默认情况区分大小写,
    grep -l pattern files :只列出匹配的文件名,
    grep -L pattern files :列出不匹配的文件名,
    grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’),
    grep -C number pattern files :匹配的上下文分别显示[number]行,
    grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行,
    grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。

    grep -n pattern files  即可显示行号信息

    grep -c pattern files  即可查找总行数

    这里还有些用于搜索的特殊符号:
    < 和 > 分别标注单词的开始与结尾。
    例如:
    grep man * 会匹配 ‘Batman’、’manic’、’man’等,
    grep ‘<man’ * 匹配’manic’和’man’,但不是’Batman’,
    grep ‘<man>’ 只匹配’man’,而不是’Batman’或’manic’等其他的字符串。
    ‘^’:指匹配的字符串在行首,
    ‘$’:指匹配的字符串在行 尾,

    Grep 命令 用法大全

    1、 参数: 
    -I :忽略大小写 
    -c :打印匹配的行数 
    -l :从多个文件中查找包含匹配项 
    -v :查找不包含匹配项的行 
    -n:打印包含匹配项的行和行标 

    首先要记住的是: 正则表达式与通配符不一样,它们表示的含义并不相同!
    正则表达式只是一种表示法,只要工具支持这种表示法, 那么该工具就可以处理正则表达式的字符串。vim、grep、awk 、sed 都支持正则表达式,也正是因为由于它们支持正则,才显得它们强大;

    1基础正则表达式

    grep 工具,以前介绍过。
    grep -[acinv]   '搜索内容串'   filename
    -a 以文本文件方式搜索
    -c 计算找到的符合行的次数
    -i 忽略大小写
    -n 顺便输出行号
    -v 反向选择,即显示不包含匹配文本的所有行

    -h 查询多文件时不显示文件名。
    -l 查询多文件时只输出包含匹配字符的文件名。
    -s 不显示不存在或无匹配文本的错误信息。
    grep命令加- E参数,这一扩展允许使用扩展模式匹配。

    其中搜索串可以是正则表达式!

    ---
    先用例子说明问题:
    以下为整理的grep 正则表达式的大部分功能,详细参见man 
    grep: 要用好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'就可以了。 

    grep正则表达式元字符集(基本集) 
    ^ 锚定行的开始 如:'^grep'匹配所有以grep开头的行。 
    $ 锚定行的结束 如:'grep$'匹配所有以grep结尾的行。 
    . 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。 
    * 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。 
    .*一起用代表任意字符。 
    [] 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。 
    [^] 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。 
    /(../) 标记匹配字符,如'/(love/)',love被标记为1。 
    /< 锚定单词的开始,
    /> 锚定单词的结束,如'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。 

    关于匹配的实例:
    grep -c "48" test.txt 统计所有以“48”字符开头的行有多少
    grep -i "May" test.txt 不区分大小写查找“May”所有的行)
    grep -n "48" test.txt 显示行号;显示匹配字符“48”的行及行号,相同于 nl test.txt |grep 48)
    grep -v "48" test.txt 显示输出没有字符“48”所有的行)
    grep "471" test.txt 显示输出字符“471”所在的行)
    grep "48;" test.txt 显示输出以字符“48”开头,并在字符“48”后是一个tab键所在的行
    grep "48[34]" test.txt 显示输出以字符“48”开头,第三个字符是“3”或是“4”的所有的行)
    grep "^[^48]" test.txt 显示输出行首不是字符“48”的行)
    grep "[Mm]ay" test.txt 设置大小写查找:显示输出第一个字符以“M”或“m”开头,以字符“ay”结束的行)
    grep "K…D" test.txt 显示输出第一个字符是“K”,第二、三、四是任意字符,第五个字符是“D”所在的行)
    grep "[A-Z][9]D" test.txt 显示输出第一个字符的范围是“A-D”,第二个字符是“9”,第三个字符的是“D”的所有的行
    grep "[35]..1998" test.txt 显示第一个字符是3或5,第二三个字符是任意,以1998结尾的所有行
    grep "4/{2,/}" test.txt 模式出现几率查找:显示输出字符“4”至少重复出现两次的所有行
    grep "9/{3,/}" test.txt 模式出现几率查找:显示输出字符“9”至少重复出现三次的所有行
    grep "9/{2,3/}" test.txt 模式出现几率查找:显示输出字符“9”重复出现的次数在一定范围内,重复出现2次或3次所有行
    grep -n "^$" test.txt 显示输出空行的行号
    ls -l |grep "^d" 如果要查询目录列表中的目录 同:ls -d *
    ls -l |grep "^d[d]" 在一个目录中查询不包含目录的所有文件
    ls -l |grpe "^d…..x..x" 查询其他用户和用户组成员有可执行权限的目录集合

    更多的例子:
    1
    搜索有the的行,并输出行号
    $grep -n 'the' regular_express.txt
    搜 索没有the的行,并输出行号
    $grep -nv 'the' regular_express.txt

    利 用[]搜索集合字符
    [] 表示其中的某一个字符 ,例如[ade] 表示a或d或e
    woody@xiaoc:~/tmp$ grep -n 't[ae]st' regular_express.txt 
    8:I can't finish the test.
    9:Oh! the soup taste good!

    可以用^符号做[]内的前缀,表示除[]内的字符之外的字 符。
    比如搜索oo前没有g的字符串所在的行. 使用 '[^g]oo' 作搜索字符串
    woody@xiaoc:~/tmp$ grep -n '[^g]oo' regular_express.txt 
    2:apple is my favorite food.
    3:Football game is not use feet only.
    18:google is the best tools for search keyword.
    19:goooooogle yes!

    [] 内可以用范围表示,比如[a-z] 表示小写字母,[0-9] 表示0~9的数字, [A-Z] 则是大写字母们。[a-zA-Z0-9]表示所有数字与英文字符。 当然也可以配合^来排除字符。
    搜索包含数字的行
    woody@xiaoc:~/tmp$ grep -n '[0-9]' regular_express.txt 
    5:However ,this dress is about $ 3183 dollars.
    15:You are the best is menu you are the no.1.

    行首与行尾字符 ^ $. ^ 表示行的开头,$表示行的结尾( 不是字符,是位置)那么‘^$’ 就表示空行,因为只有
    行首和行尾。

    这里^与[]里面使用的^意义不同。它表示^后面的串是在行的开头。
    比如搜索the在开头的行
    woody@xiaoc:~/tmp$ grep -n '^the' regular_express.txt 
    12:the symbol '*' is represented as star.

    搜索以小写字母开头的行
    woody@xiaoc:~/tmp$ grep -n '^[a-z]' regular_express.txt 
    2:apple is my favorite food.
    4:this dress doesn't fit me.
    10:motorcycle is cheap than car.
    12:the symbol '*' is represented as star.
    18:google is the best tools for search keyword.
    19:goooooogle yes!
    20:go! go! Let's go.
    woody@xiaoc:~/tmp$ 

    搜索开头不是英文字母的行
    woody@xiaoc:~/tmp$ grep -n '^[^a-zA-Z]' regular_express.txt 
    1:"Open Source" is a good mechanism to develop programs.
    21:#I am VBird
    woody@xiaoc:~/tmp$ 

    $表示它前面的串是在行的结尾,比如 '/.' 表示 . 在一行的结尾
    搜索末尾是.的行
    woody@xiaoc:~/tmp$ grep -n '/.$' regular_express.txt //. 是正则表达式的特殊符号,所以要用/转义
    1:"Open Source" is a good mechanism to develop programs.
    2:apple is my favorite food.
    3:Football game is not use feet only.
    4:this dress doesn't fit me.
    5:However ,this dress is about $ 3183 dollars.
    6:GNU is free air not free beer.
    .....

    注意在MS的系统下生成的文本文件,换行会加上一个 ^M 字符。所以最后的字符会是隐藏的^M ,在处理Windows
    下面的文本时要特别注意!
    可以用cat dos_file | tr -d '/r' > unix_file 来删除^M符号。 ^M==/r

    那么'^$' 就表示只有行首行尾的空行拉!
    搜索空行
    woody@xiaoc:~/tmp$ grep -n '^$' regular_express.txt 
    22:
    23:
    woody@xiaoc:~/tmp$ 

    搜索非空行
    woody@xiaoc:~/tmp$ grep -vn '^$' regular_express.txt 
    1:"Open Source" is a good mechanism to develop programs.
    2:apple is my favorite food.
    3:Football game is not use feet only.
    4:this dress doesn't fit me.

     

  • 相关阅读:
    【Lintcode】112.Remove Duplicates from Sorted List
    【Lintcode】087.Remove Node in Binary Search Tree
    【Lintcode】011.Search Range in Binary Search Tree
    【Lintcode】095.Validate Binary Search Tree
    【Lintcode】069.Binary Tree Level Order Traversal
    【Lintcode】088.Lowest Common Ancestor
    【Lintcode】094.Binary Tree Maximum Path Sum
    【算法总结】二叉树
    库(静态库和动态库)
    从尾到头打印链表
  • 原文地址:https://www.cnblogs.com/dushikang/p/8206848.html
Copyright © 2011-2022 走看看