您好,欢迎来到思海网络,我们将竭诚为您提供优质的服务! 诚征网络推广 | 网站备案 | 帮助中心 | 软件下载 | 购买流程 | 付款方式 | 联系我们 [ 会员登录/注册 ]
促销推广
客服中心
业务咨询
有事点击这里…  531199185
有事点击这里…  61352289
点击这里给我发消息  81721488
有事点击这里…  376585780
有事点击这里…  872642803
有事点击这里…  459248018
有事点击这里…  61352288
有事点击这里…  380791050
技术支持
有事点击这里…  714236853
有事点击这里…  719304487
有事点击这里…  1208894568
有事点击这里…  61352289
在线客服
有事点击这里…  531199185
有事点击这里…  61352288
有事点击这里…  983054746
有事点击这里…  893984210
当前位置:首页 >> 技术文章 >> 文章浏览
技术文章

Linux文本匹配命令grep与fgrep使用

添加时间:2016-5-9 19:19:10  添加: 思海网络 
grep 

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。Linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。

grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

grep --help
匹配模式选择:
 -E, --extended-regexp     扩展正则表达式egrep
 -F, --fixed-strings       一个换行符分隔的字符串的集合fgrep
 -G, --basic-regexp        基本正则
 -P, --perl-regexp         调用的perl正则
 -e, --regexp=PATTERN      后面根正则模式,默认无
 -f, --file=FILE           从文件中获得匹配模式
 -i, --ignore-case         不区分大小写
 -w, --word-regexp         匹配整个单词
 -x, --line-regexp         匹配整行
 -z, --null-data           一个 0 字节的数据行,但不是空行

杂项:
 -s, --no-messages         不显示错误信息
 -v, --invert-match        显示不匹配的行
 -V, --version             显示版本号
 --help                    显示帮助信息
 --mmap                use memory-mapped input if possible

输入控制:
 -m, --max-count=NUM       匹配的最大数
 -b, --byte-offset         打印匹配行前面打印该行所在的块号码。
 -n, --line-number         显示的加上匹配所在的行号
 --line-buffered           刷新输出每一行
 -H, --with-filename       当搜索多个文件时,显示匹配文件名前缀
 -h, --no-filename         当搜索多个文件时,不显示匹配文件名前缀
 --label=LABEL            print LABEL as filename for standard input
 -o, --only-matching       只显示一行中匹配PATTERN 的部分
 -q, --quiet, --silent      不显示任何东西
 --binary-files=TYPE   假定二进制文件的TYPE 类型;
                                      TYPE 可以是`binary', `text', 或`without-match'
 -a, --text                匹配二进制的东西
 -I                        不匹配二进制的东西
 -d, --directories=ACTION  目录操作,读取,递归,跳过
 -D, --devices=ACTION      设置对设备,FIFO,管道的操作,读取,跳过
 -R, -r, --recursive       递归调用
 --include=PATTERN     只查找匹配FILE_PATTERN 的文件
 --exclude=PATTERN     跳过匹配FILE_PATTERN 的文件和目录
 --exclude-from=FILE   跳过所有除FILE 以外的文件
 -L, --files-without-match 匹配多个文件时,显示不匹配的文件名
 -l, --files-with-matches  匹配多个文件时,显示匹配的文件名
 -c, --count               显示匹配了多少次
 -Z, --null                在FILE 文件最后打印空字符

文件控制:
 -B, --before-context=NUM  打印匹配本身以及前面的几个行由NUM控制
 -A, --after-context=NUM   打印匹配本身以及随后的几个行由NUM控制
 -C, --context=NUM         打印匹配本身以及随后,前面的几个行由NUM控制
 -NUM                      根-C的用法一样的
 --color[=WHEN],
 --colour[=WHEN]       使用标志高亮匹配字串;
 
 -U, --binary               使用标志高亮匹配字串;
 -u, --unix-byte-offsets   当CR 字符不存在,报告字节偏移(MSDOS 模式)

例:
测试文件



代码如下:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false,aaa,bbbb,cccc,aaaaaa
DADddd:x:2:2:daemon:/sbin:/bin/false
mail:x:8:12:mail:/var/spool/mail:/bin/false
ftp:x:14:11:ftp:/home/ftp:/bin/false
&nobody:$:99:99:nobody:/:/bin/false
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
http:x:33:33::/srv/http:/bin/false
dbus:x:81:81:System message bus:/:/bin/false
hal:x:82:82:HAL daemon:/:/bin/false
mysql:x:89:89::/var/lib/mysql:/bin/false
aaa:x:1001:1001::/home/aaa:/bin/bash
ba:x:1002:1002::/home/zhangy:/bin/bash
test:x:1003:1003::/home/test:/bin/bash
@zhangying:*:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:Po

a,匹配含有root的行


代码如下:
[root@krlcgcms01 test]# grep root test 
root:x:0:0:root:/root:/bin/bash 

b,匹配以root开头或者以zhang开头的行,注意反斜杠


代码如下:
[root@krlcgcms01 test]# cat test |grep '^\(root\|zhang\)' 
root:x:0:0:root:/root:/bin/bash 
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash 

c,匹配以root开头或者以zhang开头的行,注意反斜杠,根上面一个例子一样,-e默认是省去的

[root@krlcgcms01 test]# cat test |grep -e '^\(root\|zhang\)'  
root:x:0:0:root:/root:/bin/bash  
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash  
d,匹配以zhang开头,只含有字母



代码如下:
[root@krlcgcms01 test]# echo 'zhangying' |grep '^zhang[a-z]*$' 
zhangying 

e,匹配以bin开头的行,用的egrep,在这里可以换成-F,-G


代码如下:
[root@krlcgcms01 test]# cat test |grep -E '^bin' 
bin:x:1:1:bin:/bin:/bin/false,aaa,bbbb,cccc,aaaaaa 

f,在匹配的行前面加上该行在文件中,或者输出中所在的行号


代码如下:
[root@krlcgcms01 test]# cat test|grep -n zhangy 
7:zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash 
13:ba:x:1002:1002::/home/zhangy:/bin/bash 
15:@zhangying:*:1004:1004::/home/test:/bin/bash 

g,不匹配以bin开头的行,并显示行号


代码如下:
[root@krlcgcms01 test]# cat test|grep -nv '^bin' 
root:x:0:0:root:/root:/bin/bash
DADddd:x:2:2:daemon:/sbin:/bin/false
mail:x:8:12:mail:/var/spool/mail:/bin/false
ftp:x:14:11:ftp:/home/ftp:/bin/false
&nobody:$:99:99:nobody:/:/bin/false
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
http:x:33:33::/srv/http:/bin/false
dbus:x:81:81:System message bus:/:/bin/false
hal:x:82:82:HAL daemon:/:/bin/false
mysql:x:89:89::/var/lib/mysql:/bin/false
aaa:x:1001:1001::/home/aaa:/bin/bash
ba:x:1002:1002::/home/zhangy:/bin/bash
test:x:1003:1003::/home/test:/bin/bash
@zhangying:*:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:Po

h,显示匹配的个数,不显示内容


代码如下:
[root@krlcgcms01 test]# cat test|grep -c zhang 

i,匹配system,没有加-i没有匹配到东西。


代码如下:
[root@krlcgcms01 test]# grep system test 
[root@krlcgcms01 test]# grep -ni system test 
9:dbus:x:81:81:System message bus:/:/bin/false 

j,匹配zhan没有匹配到东西,匹配zhangy能匹配到,因为在test文件中,有zhangy这个单词


代码如下:
[root@krlcgcms01 test]# cat test|grep -w zhan 
[root@krlcgcms01 test]# cat test|grep -w zhangy 
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash 
ba:x:1002:1002::/home/zhangy:/bin/bash 

k,在这里-x后面东西,和输出中的整行相同时,才会输出

[root@krlcgcms01 test]# echo "aaaaaa" |grep -x aaa  
[root@krlcgcms01 test]# echo "aaaa" |grep -x aaaa  
aaaa  
l,最多只匹配一次,如果把-m 1去掉的话,会有三个



代码如下:
[root@krlcgcms01 test]# cat test |grep -m 1 zhang 
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash 

m,匹配行的前面显示块号,这个块号是干什么的,不知道,有谁知道可否告诉我一下


代码如下:
[apacheuser@krlcgcms01 test]$ cat test |grep -b zha 
241:zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash 
480:ba:x:1002:1002::/home/zhangy:/bin/bash 
558:@zhangying:*:1004:1004::/home/test:/bin/bash 

n,多文件匹配时,在匹配的行前面加上文件名


代码如下:
[apacheuser@krlcgcms01 test]$ grep -H 'root' test test2 testbak 
test:root:x:0:0:root:/root:/bin/bash 
test2:root 
testbak:root:x:0:0:root:/root:/bin/bash
  
o,多文件匹配时,在匹配的行前面不加上文件名


代码如下:
[apacheuser@krlcgcms01 test]$ grep -h 'root' test test2 testbak 
root:x:0:0:root:/root:/bin/bash 
root 
root:x:0:0:root:/root:/bin/bash 

p,多文件匹配时,显示匹配文件的文件名


代码如下:
[apacheuser@krlcgcms01 test]$ grep -l 'root' test test2 testbak DAta 
test 
test2 
testbak 

q,没有-o时,有一行匹配,这一行里面有3个root,加上-o后,这个3个root就出来了


代码如下:
[apacheuser@krlcgcms01 test]$ grep 'root' test 
root:x:0:0:root:/root:/bin/bash 
[apacheuser@krlcgcms01 test]$ grep -o 'root' test 
root 
root 
root 

r,递归显示匹配的内容,在test目录下面建个mytest目录,copy test目录下面的test文件到mytest下面,能看到上面的结果


代码如下:
[root@krlcgcms01 test]# grep test -R /tmp/test/mytest 
/tmp/test/mytest/test:test:x:1003:1003::/home/test:/bin/bash 
/tmp/test/mytest/test:@zhangying:*:1004:1004::/home/test:/bin/bash 

s,显示匹配root后面的3行


代码如下:
[root@krlcgcms01 test]# cat test |grep -A 3 root 
root:x:0:0:root:/root:/bin/bash 
bin:x:1:1:bin:/bin:/bin/false,aaa,bbbb,cccc,aaaaaa 
daemon:x:2:2:daemon:/sbin:/bin/false 
mail:x:8:12:mail:/var/spool/mail:/bin/false 

fgrep
用法: fgrep [选项]... PATTERN [FILE]...
在每个 FILE 或是标准输入中查找 PATTERN。
PATTERN 是一组由断行符分隔的定长字符串。
例如: fgrep -i 'hello world' menu.h main.c

正则表达式选择与解释:
  -e, --regexp=PATTERN      用 PATTERN 来进行匹配操作
  -f, --file=FILE           从 FILE 中取得 PATTERN
  -i, --ignore-case         忽略大小写
  -w, --word-regexp         强制 PATTERN 仅完全匹配字词
  -x, --line-regexp         强制 PATTERN 仅完全匹配一行
  -z, --null-data           一个 0 字节的数据行,但不是空行

杂项:
  -s, --no-messages         不显示错误信息
  -v, --invert-match        选中不匹配的行
  -V, --version             显示版本信息并退出
      --help                显示此帮助并退出
      --mmap                忽略向后兼容性

Output control:
  -m, --max-count=NUM      匹配的最大数
  -b, --byte-offset         打印匹配行前面打印该行所在的块号码
  -n, --line-number         显示的加上匹配所在的行号
      --line-buffered         刷新输出每一行
  -H, --with-filename       当搜索多个文件时,显示匹配文件名前缀
  -h, --no-filename         当搜索多个文件时,不显示匹配文件名前缀
      --label=LABEL         use LABEL as the standard input file name prefix
  -o, --only-matching       只显示一行中匹配PATTERN 的部分
  -q, --quiet, --silent     不显示所有输出
      --binary-files=TYPE   假定二进制文件的TYPE 类型;
                            TYPE 可以是`binary', `text', 或`without-match'
  -a, --text                等同于 --binary-files=text
  -I                        等同于 --binary-files=without-match
  -d, --directories=ACTION  操作目录的方式;
                            ACTION 可以是`read', `recurse',或`skip'
  -D, --devices=ACTION      操作设备、先入先出队列、套接字的方式;
                            ACTION 可以是`read'或`skip'
  -R, -r, --recursive       等同于 --directories=recurse
      --include=FILE_PATTERN  只查找匹配FILE_PATTERN 的文件
      --exclude=FILE_PATTERN  跳过匹配FILE_PATTERN 的文件和目录
      --exclude-from=FILE   跳过所有除FILE 以外的文件
      --exclude-dir=PATTERN  跳过所有匹配PATTERN 的目录。
  -L, --files-without-match  只打印不匹配FILEs 的文件名
  -l, --files-with-matches  只打印匹配FILES 的文件名
  -c, --count               只打印每个FILE 中的匹配行数目
  -T, --initial-tab         行首tabs 分隔(如有必要)
  -Z, --null                在FILE 文件最后打印空字符

文件控制:
  -B, --before-context=NUM  打印以文本起始的NUM 行
  -A, --after-context=NUM   打印以文本结尾的NUM 行
  -C, --context=NUM         打印输出文本NUM 行
  -NUM                      等同于 --context=NUM
      --color[=WHEN],
      --colour[=WHEN]       使用标志高亮匹配字串;
                            WHEN 可以是`always', `never'或`auto'
  -U, --binary              不要清除行尾的CR 字符(MSDOS 模式)
  -u, --unix-byte-offsets   当CR 字符不存在,报告字节偏移(MSDOS 模式)

‘fgrep’已不再使用了;请用 ‘grep -F’代替。
不带 FILE 参数,或是 FILE 为 -,将读取标准输入。如果少于两个 FILE 参数
就要默认使用 -h 参数。如果选中任意一行,那退出状态为 0,否则为 1;
如果有错误产生,且未指定 -q 参数,那退出状态为 2。
例:

代码如下:
[root@linux test]# cat abc.sh |fgrep a #匹配含有a的行

关键字:Linux、命令、grep、fgrep
分享到:

顶部 】 【 关闭
版权所有:佛山思海电脑网络有限公司 ©1998-2024 All Rights Reserved.
联系电话:(0757)22630313、22633833
中华人民共和国增值电信业务经营许可证: 粤B1.B2-20030321 备案号:粤B2-20030321-1
网站公安备案编号:44060602000007 交互式栏目专项备案编号:200303DD003  
察察 工商 网安 举报有奖  警警  手机打开网站