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

  ./fk.c:#include

  ./flower2.c:#include

  ./flower2.c:#include

  ./recursive_flower.c:#include

  ./recursive_flower.c:#include

  ./recursive_flower.c:#include

  ./recursive_flower.c:#define m 8

  ./flower.c:#include

  ./flower.c:#include

  ./flower.c:#include

  ./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结尾的单词的行。

  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],如:'Gw*p'匹配以G后跟零个或多个文字或数字字符,然后是p。

  W

  w的反置形式,匹配一个或多个非单词字符,如点号句号等。

  b

  单词锁定符,如: 'bgrepb'只匹配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命令假定标准输入。一般,找到的每行都复制到标准输出中去。如果不止一个输入文件,则在找到的每行前打印文件名。

时间: 2024-10-27 07:10:46

linux中grep命令的使用的相关文章

Linux中grep命令的12个实践例子

你是否遇到过需要在文件中查找一个特定的字符串或者样式,但是不知道从哪儿开始?那么,就请grep来帮你吧. grep是每个Linux发行版都预装的一个强有力的文件模式搜索工具.无论何种原因,如果你的系统没有预装它的话,你可以很容易的通过系统的包管理器来安装它(Debian/Ubuntu系中的apt-get和RHEl/CentOS/Fedora系中的yum). $ sudo apt-get install grep #Debian/Ubuntu $ sudo yum install grep #RH

linux中grep 命令技巧一则

经常用grep命令查找文件内容,如果是git管理的代码会有很多的无用信息,比如有 No such file or directory 错误 其实搜索时候加入-s即可  代码如下 复制代码 grep –r ./* –s 在abc*目录下的所有xml文件中查找字符串xyz,命令如下:  代码如下 复制代码 find abc* -name '*.xml' | xargs grep -s 'xyz'

详解Linux中vi命令大全_linux shell

vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于 对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它.Vi也是Linux中最基本的文本编 辑器,学会它后,您将在Linux的世界里畅行无阻. vi的基本概念 基本上vi可以分为三种状态,分别是命令模式(command mode).插入模式(Insert mode)和底行模式(last line m

linux中ln命令的-T参数作用

问题描述 linux中ln命令的-T参数作用 我用man ln命令查看用法,其中对-T参数的解释是 -T, --no-target-directory treat LINK_NAME as a normal file 不明白它的意思,请大家可否举例说明下什么时候才会用到这个参数 解决方案 将链接名当作普通文件(在对目录进行符号链接时要用到此选项) 解决方案二: 我尝试在本目录下ln -s ../ link_a 和 ln -s -T ../ link_b,然后再用ls -al查看link_a和li

linux中cat命令的用法

今天需要用cat查看文件,无奈忘记如何使用,于是整理了一下 linux中cat命令的用法:  1.用cat命令查看文件:$ cat file1;  $ cat -n file1:在查看的时候加上行号: cat命令还可以使用通配符:$ cat -n file*,把所有的file文件都显示出来(顺序显示)  也可以这样:$ cat -n file1 file2 file3 ;结果用通配符输出结果是完全一样的  2.合并文件 可以用cat命令和重定向操作符(>>)来合并文件: $ cat file*

Linux中grep不显示本身进程?

Linux中grep不显示本身进程? #ps -aux | grep httpd | grep -v grep grep -v grep可以取消显示你所执行的grep本身这个进程,-v参数是不显示所列出的进程名

Linux中tail命令用法详解_Linux

tail命令也是一个非常常用的文件查看类的命令,今天就为大家介绍下Linux tail命令的用法. 更多Linux命令详情请看:Linux命令速查手册 Linux tail命令主要用来从指定点开始将文件写到标准输出.很多人喜欢使用tail –f 来监控日志文件. 一.Linux tail命令格式 Linux tail命令 格式如下所示 tail [OPTION]... [FILE]... Linux tail命令 参数如下所示 -f 循环读取 -q 不显示处理信息 -v 显示详细的处理信息 -c

批处理模拟Linux中watch命令

REM 批处理模拟Linux中watch命令@echo offcolor 1f:CheckVar1if {%1} equ {} (goto Help) else goto CheckVar2 :Helpecho %0 [time] [command]echo.goto End :CheckVar2if {%1} equ {} (goto Help) else goto OK :OKecho WScript.sleep 1000*%1>%temp%/sleep.vbsFor /L %%t in (

Linux中service命令和/etc/init.d/的关系

Linux中service命令和/etc/init.d/的关系   service xxx启动 /etc/init.d/ 目录下的xxx脚本 如一个脚本名为 mysvc保存在/etc/init.d/下可以用 service mysvc 运行mysvc脚本 echo passed in option $0 $1   if [ $1 = "start" ] then         echo myservice started................................