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

    grep是一个多用途的文本搜素工具,linux中使用非常频繁,并且使用很灵活,可以是变量,也可以是字符串。最基本的用法有以下两种:

    1.搜索内容中无空格,可以直接执行grep命令,比如:grep pass a.txt,表示在a.txt文件中搜索pass所在的行。

    2.如果搜索内容中有空格,则需要使用单引号或者双引号把搜素内容引起来,比如:

    grep "hello all" a.txt或者grep 'hello all' a.txt,如果不加单双引号,则提示搜搜错误,无法识别,因为不加引号,直接grep hello all a.txt,表示在all 和a.txt中搜索hello,这肯定是不对的

    grep的一些参数命令:
    1.grep -c option file:显示文件中包含搜索内容行数,比如前面的命令表示显示 file中包含option内容的行数是几

    2. grep -n option flie:列出所有的匹配行,并在最前面添加行的序列数

    3. grep -v option file:显示文件中不包含所搜索内容的行数,这个和-c的参数正好相反

    4. gep -i option file:列出所搜索内容的匹配行,搜索过程中不区分大小写

    5. grep -l option *:列出所有包含option内容的文件的名

    6. grep -r option :对当前目录和所有的子目录进行搜索

    7. grep -w option file:精确搜索,可以说准确性搜索,比如:grep -w b* a.txt:此命令执行时,*不会默认为任何字符,只表示字面意思,就是一个*字符.

    8. grep -x option file:完全匹配输出,比如:grep -x hello a.txt,只会输出某一行存在hello字符串,并且此行仅包含hello的内容。假设a.txt中有一行“hello all”,执行上述命令,此行不会被搜索到。

    基础正则表达式 

    grep 工具,以前介绍过。
    grep -[acinv] '搜索内容串' filename
    -a 以文本文件方式搜索
    -c 计算找到的符合行的次数
    -i 忽略大小写
    -n 顺便输出行号
    -v 反向选择,即找 没有搜索字符串的行
    其中搜索串可以是正则表达式!

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

    2 利 用[]搜索集合字符
    [] 表示其中的某一个字符 ,例如[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 ' ' > unix_file 来删除^M符号。 ^M==

    那么'^$' 就表示只有行首行尾的空行拉!
    搜索空行
    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.
    ..........

    任意一个字符. 与重复字符 *

    在bash中*代表通配符,用来代表任意个 字符,但是在正则表达式中,他含义不同,*表示有0个或多个 某个字符。
    例如 oo*, 表示第一个o一定存在,第二个o可以有一个或多个,也可以没有,因此代表至少一个o.

    点. 代表一个任意字符,必须存在。 g??d 可以用 'g..d' 表示。 good ,gxxd ,gabd .....都符合。

    woody@xiaoc:~/tmp$ grep -n 'g..d' regular_express.txt
    1:"Open Source" is a good mechanism to develop programs.
    9:Oh! the soup taste good!
    16:The world is the same with 'glad'.
    woody@xiaoc:~/tmp$

    搜索两个o以上的字符串
    woody@xiaoc:~/tmp$ grep -n 'ooo*' regular_express.txt //前两个o一定存在,第三个o可没有,也可有多个。
    1:"Open Source" is a good mechanism to develop programs.
    2:apple is my favorite food.
    3:Football game is not use feet only.
    9:Oh! the soup taste good!
    18:google is the best tools for search keyword.
    19:goooooogle yes!

    搜索g开头和结尾,中间是至少一个o的字符串,即gog, goog....gooog...等
    woody@xiaoc:~/tmp$ grep -n 'goo*g' regular_express.txt
    18:google is the best tools for search keyword.
    19:goooooogle yes!

    搜索g开头和结尾的字符串在的行
    woody@xiaoc:~/tmp$ grep -n 'g.*g' regular_express.txt // .*表示 0个或多个任意字符
    1:"Open Source" is a good mechanism to develop programs.
    14:The gd software is a library for drafting programs.
    18:google is the best tools for search keyword.
    19:goooooogle yes!
    20:go! go! Let's go.


    限定连续重复字符的范围 { }
    . * 只能限制0个或多个, 如果要确切的限制字符重复数量,就用{范围} 。范围是数字用,隔开 2,5 表示2~5个,
    2表示2个,2, 表示2到更多个
    注意,由于{ }在SHELL中有特殊意义,因此作为正则表达式用的时候要用转义一下。

    搜索包含两个o的字符串的行。
    woody@xiaoc:~/tmp$ grep -n 'o{2}' 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.
    9:Oh! the soup taste good!
    18:google is the best tools for search keyword.
    19:goooooogle yes!

    搜索g后面跟2~5个o,后面再跟一个g的字符串的行。
    woody@xiaoc:~/tmp$ grep -n 'go{2,5}g' regular_express.txt
    18:google is the best tools for search keyword.


    搜索包含g后面跟2个以上o,后面再跟g的行。
    woody@xiaoc:~/tmp$ grep -n 'go{2,}g' regular_express.txt
    18:google is the best tools for search keyword.
    19:goooooogle yes!


    注意,相让[]中的^ - 不表现特殊意义,可以放在[]里面内容的后面。
    '[^a-z.!^ -]' 表示没有小写字母,没有. 没有!, 没有空格,没有- 的 串,注意[]里面有个小空格。

    另外shell 里面的反向选择为[!range], 正则里面是 [^range]


    2扩展正则表达式

    扩展正则表达式是对基础正则表达式添加了几个特殊构成的。
    它令某些操作更加方便。
    比如我们要去除 空白行和行首为 #的行, 会这样用:
    woody@xiaoc:~/tmp$ grep -v '^$' regular_express.txt | grep -v '^#'
    "Open Source" is a good mechanism to develop programs.
    apple is my favorite food.
    Football game is not use feet only.
    this dress doesn't fit me.
    ............

    然而使用支持扩展正则表达式的 egrep 与扩展特殊符号 | ,会方便许多。
    注意grep只支持基础表达式, 而egrep 支持扩展的, 其实 egrep 是 grep -E 的别名而已。因此grep -E 支持扩展正则。
    那么:
    woody@xiaoc:~/tmp$ egrep -v '^$|^#' regular_express.txt
    "Open Source" is a good mechanism to develop programs.
    apple is my favorite food.
    Football game is not use feet only.
    this dress doesn't fit me.
    ....................
    这里| 表示或的关系。 即满足 ^$ 或者 ^# 的字符串。

    这里列出几个扩展特殊符号:
    +, 于 . * 作用类似,表示 一个或多个重复字符。
    ?, 于 . * 作用类似,表示0个或一个字符。
    |,表示或关系,比如 'gd|good|dog' 表示有gd,good或dog的串
    (),将部分内容合成一个单元组。 比如 要搜索 glad 或 good 可以这样 'g(la|oo)d'
    ()的好处是可以对小组使用 + ? * 等。
    比如要搜索A和C开头结尾,中间有至少一个(xyz) 的串,可以这样 : 'A(xyz)+C'

  • 相关阅读:
    win7下的vxworks总结
    ubuntu 无法获得锁 /var/lib/dpkg/lock
    项目中用到了的一些批处理文件
    win7下安装 WINDRIVER.TORNADO.V2.2.FOR.ARM
    使用opencv统计视频库的总时长
    January 05th, 2018 Week 01st Friday
    January 04th, 2018 Week 01st Thursday
    January 03rd, 2018 Week 01st Wednesday
    January 02nd, 2018 Week 01st Tuesday
    January 01st, 2018 Week 01st Monday
  • 原文地址:https://www.cnblogs.com/dirt2/p/5254926.html
Copyright © 2011-2022 走看看