基础正则表达式和fgrep详解
【grep/ egrep】 语法:grep [-cinvABC] ‘word’filename -c:打印符合要求的行数 -i:忽略大小写 -n:在输出符合要求的行的同时连同行号一起输出 -v:打印不符合要求的行 -A:后跟一个数字(有无空格都可以),例如?A2则表示打印符合要求的行以及下面两行 -B:后跟一个数字,例如?B2则表示打印符合要求的行以及上面两行 -C:后跟一个数字,例如?C2则表示打印符合要求的行以及上下各两行 #grep -A 2 halt /etc/passwd a.过滤出带有某个关键词的行并输出行号 # grep -n “root ” /etc/passwd 显示内容是在etc/passwd 中含有root的行 b.过滤不带有某个关键词的行,并输出行号 # grep -vn “root”/etc/passwd 显示在etc/passwd下 不含有root的行和行号 c.过滤出所有包含数字的行 你可以先创建一个文件 #touch test.txt 在里面输入一些子母行 数字行 然后# grep “[0-9]”test,.txt 显示数字行 grep -v“[0-9]”test,.txt 显示非数字行 在前面也提到过这个”[ ]”的应用,如果是数字的话就用[0-9]这样的形式,当然有时候也可以用这样的形式[15]即只含有1或者5,注意,它不会认为是15。如果要过滤出数字以及大小写字母则要这样写[0-9a-zA-Z]。另外[ ]还有一种形式,就是[^字符]表示除[ ]内的字符之外的字符 这就表示筛选包含oo字符串,但是不包含r字符。 d.过滤出文档中以某个字符开头或者以某个字符结尾的行 # grep "^r.*t$" /etc/passwd 查找在、etc/passwd下fei 注: 所有行中含有以r开头以t结尾中间可以是任意字符的行 在正则表达式中,”^”表示行的开始,”$”表示行的结尾,那么空行则表示”^$”,如果你只想筛选出非空行,则可以使用“grep -v ‘^$’ filename”得到你想要的结果。 e.过滤任意一个字符与重复字符 # grep “r..o”/etc/passwd 显示所有含r..o的文件 “.”表示任意一个字符,上例中,就是把符合r与o之间有两个任意字符的行过滤出来。 “*”表示零个或多个前面的字符。 f.指定要过滤字符出现的次数 # grep "1{1,3}" /etc/passwd 显示含有1(并且至少含有1个之多含有三个)的文件 这里用到了{ },其内部为数字,表示前面的字符要重复的次数。上例中表示包含有两个o即’oo’的行。注意,{ }左右都需要加上脱意字符’’。另外,使用{ }我们还可以表示一个范围的,具体格式是‘{n1,n2}’其中n1<n2,表示重复n1到n2次前面的字符,n2还可以为空,则表示大于等于n1次。 1:上面部分说的grep,另外我们常常用到egrep这个工具,简单来说,后者是前者的扩展版本,我们可以用egrep完成grep不能完成的工作,当然了grep能完成的egrep完全可以完成。如果你嫌麻烦,egrep了解一下即可,因为grep的功能已经足够介绍egrep不用于grep的几个用法。为了试验方便 .筛选一个或一个以上前面的字符 # egrep “0+”/etc/passwd 显示文件中含有一个0或一个以上的0的文件 和grep不同的是,egrep这里是使用’+’的。 b.筛选零个或一个前面的字符 #egrep “0?”/etc/passwd 筛选出文件(含有一个或者零个)0的文件 c.筛选字符串1或者字符串2 # egrep “abc|123” /etc/passwd s筛选出含有abc或者123的文件 中间有一个’|’表示或者的意思,笔者用这个用的很多,所以这个你最好记一下。 d.egrep中’( )’的应用 用’( )’表示一个整体,例如(oo)+就表示1个’oo’或者多个’oo’ 语法: 相当于执行grep指令加上参数"-F",详见grep指令说明。 fgrep 命令于 grep 和 egrep 命令不同,因为它搜索字符串而不是搜索匹配表达式的模式。fgrep 命令使用快速的压缩算法。$,*,[,|,(,) 和 等字符串被 fgrep 命令按字面意思解释。这些字符并不解释为正则表达式,但它们在 grep 和 egrep 命令中解释为正则表达式。因为这些字符对于 shell 有特定的含义,完整的字符串应该加上单引号(‘ ... ’)。. 如果没有指定文件, fgrep 命令假定标准输入。一般,找到的每行都复制到标准输出中去。如果不止一个输入文件,则在找到的每行前打印文件名。 4注意:编辑 1. fgrep 命令和带 -F 标志的 grep命令是一样的但出错和用法消息不同-s 标志功能也不同。 2. 每行限制在 2048 个字节。 3. 段落(-p 标志下)目前限制在5000个字符的长度。 4. 不要在特定的文件中运行 grep 命令,因为会产生不可预料的结果。 5. 输入行不能包含空字符。 6. 输入文件应该以换行字符结尾。 7. 虽然可以同时指定很多标志,但某些标志会覆盖其余的标志。例如,如果同时指定 -l 和 -n ,只有文件名写入到标准输出中去。 标志 -b 在找到的每行之前添加行所在的块编号。使用此标志有助于按照上下文查找磁盘块号码。-b 标志不能用于标准输入或者管道输入。 -c 仅显示匹配行的计数。 -e 模式指定模式。这个工作模式很简单,但当此模式以 a-(减号) 开头时却是很有用的。 -f StringFile 指定包含字符串的文件。 -h 当多个文件被处理时隐藏文件名。 -i 当进行比较时忽略字母的大小写。 -l 只列出包含匹配行的文件名(一次)。文件名之间用换行符分隔。 n 将文件中每行的相对行号置于行前。 -pSeparator 显示包含匹配行的整个段落。段落之间将按照Separator参数指定的段落分隔符加以分隔,这些分隔符是与搜索模式有着相同格式的模式。包含段落分隔符的行将仅用作分隔符;它们不会被包含在输出中。缺省的段落分隔符是空白行。 -q 禁止所有写入到标准输出的操作,不管是否为匹配行。如果选中输入行,以 0 状态退出。 -s 仅显示出错消息。这在检查状态时很有用。 -v 显示除了匹配特定模式的行以外的所有行。 -w 执行单词搜索。 -x 显示匹配模式的行,要求无额外的字符。 -y 当进行比较时忽略字符的大小写。 5退出状态编辑 此命令返回以下出口值: 0 找到匹配项。 1 未找到匹配项。 >1 发现语法错误,或者文件不可访问(即使找到了匹配项)。 6示例编辑 1. 搜索几个文件中的一个简单字符串: fgrep strcpy *.c 在当前目录下所有以 .c 字符串结尾的文件中搜索字符串 strcpy。 2. 计数匹配某模式的行数: fgrep -c 『{』pgm.cfgrep -c 『}』pgm.c 显示在 pgm.c 中包含左括号和右括号的行的数目。 如果在您的 C 程序中一行中没有包含多于一个 { (左括号) 或者 } (右括号),并且括号正确匹配,那么这两个数字将是一样的。如果这两个数字不一样,您可以将包含括号的行按照他们在文件中的位置顺序显示出来,使用以下命令: egrep {|} pgm.c 3. 显示包含某模式的文件名: fgrep -l strcpy *.c 搜索当前目录下以 .c 结尾的文件,然后显示包含 strcpy字符串的文件名。 7文件编辑 /usr/bin/fgrep 包含 fgrep 命令。 /bin/fgrep 链接到 fgrep 命令的符号。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |