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的元字符扩展集
+
grep命令查看进程匹配⼀个或多个先前的字符。如:'[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′aabbcc显⽰在aa,bb,cc⽂件中匹配test的⾏。 grep '[a-z]\{5\}' aa
显⽰所有包含每个字符串有5个连续⼩写字符的字符串的⾏。
grep′w\(es\)t.∗\1′aa如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.∗),这些字符后⾯紧跟着另外⼀个, *, [, |, ^, (, ), \ ) 出现在 Pattern 参数中时必须带双引号。如果 Pattern 参数不是简单字符串,通常必须⽤单引号将整个模式括起来。在表达式中⽐如 [a-z],减号表⽰通过当前整理
序列。整理序列可以定义等价的类以供在字符范围中使⽤。它使⽤了快速确定性的算法,有时需要外部空间。[2]fgrep 命令, 为⽂件搜索⽂字字符串。
fgrep命令搜索 File 参数指定的输⼊⽂件(缺省为标准输⼊)中的匹配模式的⾏。fgrep命令特别搜索 Pattern 参数,它们是固定的字符串。如果在 File 参数中指定⼀个以上的⽂
件fgrep命令将显⽰包含匹配⾏的⽂件。
fgrep命令于 grep 和 egrep 命令不同,因为它搜索字符串⽽不是搜索匹配表达式的模式。fgrep命令使⽤快速的压缩算法。$, *, [, |, (, ) 和 \ 等字符串被fgrep命令按字⾯意思解释。
这些字符并不解释为正则表达式,但它们在 grep 和 egrep 命令中解释为正则表达式。
因为这些字符对于 shell 有特定的含义,完整的字符串应该加上单引号(‘ ... ’)。
如果没有指定⽂件,fgrep命令假定标准输⼊。⼀般,到的每⾏都复制到标准输出中去。如果不⽌⼀个输⼊⽂件,则在到的每⾏前打印⽂件名。
Processing math: 100%
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论