grep的基本用法详解
2015-06-10 20:07
405 查看
grep是linux上常用的一个文本处理工具之一。它有着强大的文本处理能力,学会它,可以让工作更有效率。一、初识grep grep: Global search Regular Experssion and Printout line 从名字上也可以直观的了解到它是基于正则表达式进行全局搜索,并把结果打印到屏幕上来。 说白了,它就是根据用户指定的“模式(pattern)”来对文本进行过滤,并显示匹配到的行的文本搜索工具。
二、何为“模式” 所谓模式,就是由一类字符书写,但是这些字符不表示字符本身字面的意义,而是表示控制或通配的功能。它还有一个高雅的名字,即正则表达式。
三、了解正则表达式 1、基本的元字符 . 匹配任意的字符 * 匹配其前面的字符任意次数,0,1或多次 \? 匹配其前面的字符0次或1次 \+ 匹配其前面的字符1次以上 2、按字符匹配: .: 匹配任意单个字符 []: 匹配指定集合中的任意单个字符 常用的字符集合: [[:digit:]],[0-9] 表示0-9的任意数字 [[:lower:]], [a-z] 表示26个小写英文字母 [[:upper:]], [A-Z] 表示26个大写英文字母 [[:alpha:]], [a-zA-Z] 表示所有英文字母 [[:alnum:]], [[0-9a-zA-Z]表示数字,所有英文字母 [[:space:]] 表示空白字符 [[:punct:]] 表示符号字符 [^]: 匹配指定集合外的任意单个字符 3、按匹配次数匹配: * : 匹配其前面任意字符任意次数 \?: 匹配其前面的字符0次或1次 \+: 匹配其前面的字符出现至少1次 \{m\}: 匹配其前面的字符出现m次 \{m,n\}: 匹配其前面的字符至少m次,至多n次 .* : 常用组合,表示任意长度的任意字符 4、实现位置锚定 ^ : 写在模式的最左侧,表示锚定行首 $ : 写在模式的最右侧,表示锚定行尾 \<: 写在要查找的单词模式的左侧,做单词词首锚定 \>: 写在要查找的单词模式的右侧,做单词词尾锚定 ^$: 常用组合,表示空白行 \<pattern\>: 匹配单词 5、实现分组(只要功能可以用于实现后向引用) \(\): 在模式中,如果使用了分组,在某行文本检测中,如果\(\)匹配到了某内容,此内容可以在后面的模式中被引用。 \# : 引用之前被\(\)所匹配到的内容,模式自左而右,引用第#个左括号以及其匹配右括号之间的模式匹配到的内容。
三、grep命令 1、基本语法: grep [OPTIONS] PATTERN [FILE…] 常用选项: -i, –ignore-case : 忽略字符大小写 -o, –only-matching : 只显示被模式匹配到的内容 -v, –invert-match : 反向选取,显示被模式匹配到的内容的相反内容 -A #,–after-context=#: 显示被模式匹配到的行和此行之后的#行 -B #,–before-context=#: 显示被模式匹配到的行和此行之前的#行 -C #,–context=#: 显示被模式匹配到的行和此行前后的#行 -r, -R, –recursive: 递归查询,对目录下的子目录也会进行查询 -E, –extended-regexp: 使用扩展正则表达式进行匹配,相当于egrep -F, –fixed-strings: 不使用正则表达式经行匹配,即忽略元字符的意义,相当于fgrep –color={never,always,auto}:可以设置颜色显示,可以进行别名,方便使用。例如:alias grep='grep –color=auto'
四、知识点练习接下来我们以以下文本文件的内容来进行练习
练习1:显示b出现3次以上的行
练习2:统计文本文件中work|WORK出现的次数
练习3:显示所有包含符号的行
练习4:找出其中最后一个单词是由此前某单词加er构成的行。
五、实际的应用有了以上的知识储备,我们就可以用grep来进行一些基本的处理工作了。1、在/etc/passwd上查找以/sbin/nolog结尾的行,即可以使用以/bin/nologin为结束的位置锚定进行选取
2、在/etc/passwd上查找用户id和组id在500到1099之间的行
3、查找当前系统上网卡驱动程序的名称
本文出自 “封于修” 博客,请务必保留此出处http://fengyuxiu.blog.51cto.com/5741934/1660595
二、何为“模式” 所谓模式,就是由一类字符书写,但是这些字符不表示字符本身字面的意义,而是表示控制或通配的功能。它还有一个高雅的名字,即正则表达式。
三、了解正则表达式 1、基本的元字符 . 匹配任意的字符 * 匹配其前面的字符任意次数,0,1或多次 \? 匹配其前面的字符0次或1次 \+ 匹配其前面的字符1次以上 2、按字符匹配: .: 匹配任意单个字符 []: 匹配指定集合中的任意单个字符 常用的字符集合: [[:digit:]],[0-9] 表示0-9的任意数字 [[:lower:]], [a-z] 表示26个小写英文字母 [[:upper:]], [A-Z] 表示26个大写英文字母 [[:alpha:]], [a-zA-Z] 表示所有英文字母 [[:alnum:]], [[0-9a-zA-Z]表示数字,所有英文字母 [[:space:]] 表示空白字符 [[:punct:]] 表示符号字符 [^]: 匹配指定集合外的任意单个字符 3、按匹配次数匹配: * : 匹配其前面任意字符任意次数 \?: 匹配其前面的字符0次或1次 \+: 匹配其前面的字符出现至少1次 \{m\}: 匹配其前面的字符出现m次 \{m,n\}: 匹配其前面的字符至少m次,至多n次 .* : 常用组合,表示任意长度的任意字符 4、实现位置锚定 ^ : 写在模式的最左侧,表示锚定行首 $ : 写在模式的最右侧,表示锚定行尾 \<: 写在要查找的单词模式的左侧,做单词词首锚定 \>: 写在要查找的单词模式的右侧,做单词词尾锚定 ^$: 常用组合,表示空白行 \<pattern\>: 匹配单词 5、实现分组(只要功能可以用于实现后向引用) \(\): 在模式中,如果使用了分组,在某行文本检测中,如果\(\)匹配到了某内容,此内容可以在后面的模式中被引用。 \# : 引用之前被\(\)所匹配到的内容,模式自左而右,引用第#个左括号以及其匹配右括号之间的模式匹配到的内容。
三、grep命令 1、基本语法: grep [OPTIONS] PATTERN [FILE…] 常用选项: -i, –ignore-case : 忽略字符大小写 -o, –only-matching : 只显示被模式匹配到的内容 -v, –invert-match : 反向选取,显示被模式匹配到的内容的相反内容 -A #,–after-context=#: 显示被模式匹配到的行和此行之后的#行 -B #,–before-context=#: 显示被模式匹配到的行和此行之前的#行 -C #,–context=#: 显示被模式匹配到的行和此行前后的#行 -r, -R, –recursive: 递归查询,对目录下的子目录也会进行查询 -E, –extended-regexp: 使用扩展正则表达式进行匹配,相当于egrep -F, –fixed-strings: 不使用正则表达式经行匹配,即忽略元字符的意义,相当于fgrep –color={never,always,auto}:可以设置颜色显示,可以进行别名,方便使用。例如:alias grep='grep –color=auto'
四、知识点练习接下来我们以以下文本文件的内容来进行练习
练习1:显示b出现3次以上的行
grep "b\{3,\}" test.txt
练习2:统计文本文件中work|WORK出现的次数
grep -i -o "\<work\>" test.txt | wc -l
练习3:显示所有包含符号的行
grep "[[:punct:]]" test.txt
练习4:找出其中最后一个单词是由此前某单词加er构成的行。
grep "\(\<[[:alpha:]]\+\>\).*\1er" test.txt
五、实际的应用有了以上的知识储备,我们就可以用grep来进行一些基本的处理工作了。1、在/etc/passwd上查找以/sbin/nolog结尾的行,即可以使用以/bin/nologin为结束的位置锚定进行选取
grep "/sbin/nologin$" /etc/passwd
2、在/etc/passwd上查找用户id和组id在500到1099之间的行
grep "\<1\?[05][0-9][0-9]\>" /etc/passwd
3、查找当前系统上网卡驱动程序的名称
#显示pci设备中网卡的信息 #最前面的 “02:01.0” 就是设备在PCI总线上的代号,该代号在整个系统中是唯一的。(因为当前系统上有两块网卡,所以有两条信息) [root@localhost tmp]# lspci | grep "Ethernet" 02:01.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01) 02:05.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01) #sys目录是内核将设备信息映射出来的一个伪文件系统,所以我们查找到的那一行信息中drivers的子目录e1000即是网卡设备的驱动名称 [root@localhost tmp]# find /sys/bus/pci/drivers | grep "02:01.0" /sys/bus/pci/drivers/e1000/0000:02:01.0其实要做的事也就2步,然后我们可以把这些命令通过管道(|)来把命令连接起来,实现功能。
本文出自 “封于修” 博客,请务必保留此出处http://fengyuxiu.blog.51cto.com/5741934/1660595
相关文章推荐
- 乐视生态危机背后,互联网电视谁将后发制人
- Java实验五报告——TCP传输及加解密
- C++ stream
- android导入工程出现红色感叹号
- 上坡和下坡,我们要走上坡路~!
- Leetcode[83]-Remove Duplicates from Sorted List
- HDU 丑数 - 1058 Humble Numbers
- springMvc
- HAProxy基础及案例演示
- 如何在加载JSP页面时,同时调用servlet中的方法
- java 定时器
- tar不能解压.zip格式包
- 在ubuntu上安装hadoop2.2.0
- 学会享受寂寞,才能享受爱情
- Linux 驱动之 platform 驱动模型总结 (基于tiny210 平台 LED 驱动)
- js数组操作-数组去重
- 小公司不要怕!
- Java特性-封装
- scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据
- Go语言统计中文词语的个数,分词.