一、linux文本查找命令
三个基本常用的命令
1、grep:最早的文本匹配程序,使用POSIX定义的基本正则表达式(BRE)来匹配文本
2、egrep:扩展式grep,其使用扩展式正则表达式(ERE)来匹配文本
3、fgrep:快速grep,这个版本匹配固定字符串而非正则表达式。
二、grep的基本语法
GREP [options … ] pattern-spec [files…]
用途:匹配一个或多个模式的文本行
options:
-E:使用扩展正则表达式进行匹配
-i:忽略大小写
--color 加以颜色可以添加别名
laias gerp ='grep --color'
-v:反向显示,没有被模式匹配到的行
-o:只显示被模式匹配到的字符串
-A(后面加数字):找到行显示行后面的n行
grep -A 2 '^core id ' /prp/cpuinfo
-B(后面加数字):找到行显示前面的n行
grep -B 2 '^core id ' /prp/cpuinfo
-C(后面加数字):找到行的前后n行
grep -C 2 '^core id ' /prp/cpuinfo
三、简单介绍
组成部分:一般字符:没有特殊意义的字符
特殊字符:也称meta字符,元字符,在正则表达式中有特殊的意义
常见的元字符:
\ :通常用于打开或者关闭后续字符的特殊含义,如\(…\)与\{…\}
. :匹配任意单个字符(除NUL)
* : 匹配前面的字符任意次
.* :任意长度的任意字符 例如: a.*b: 以字母a开头
[] :匹配指定范围内任意单个字符
[^] :匹配指定范围外的任意字符
\? :匹配前面的字符0次或者1次
\{…\} :匹配前面的字符1次或者0次
例如: \{0,1\} 匹配一次
grep 'a\{2,3\}' aa.txt
grep 'a.\{2,3\}' aa.txt
egrep:
+ : 匹配前面的正则表达式1个或者多个扩张
| :匹配|前或者后的正则表达式
( ):匹配方刮号起来的正则表达式群 ([])
位置锚定:
^ :锚定行首,此字符后面的任意内容必须出现在行首
$:锚定行尾,此字符前面的任意字符必须出现在行尾
^$:空白行
\<:其后面的任意字符必须作为单词首部出现
\>:其前面的任意字符必须作为单词的尾部出现
\<root\>
实例: grep '\<root' aa.ttx grep 'root\>' aa.ttx grep '\<root\>' aa.ttx
分组:\(\)
\(ab\)* 匹配ab
向后引用
\1:引用第一个左刮号以及与之对应的右刮号内的所有内容
\2:引用第二个左刮号以及与之对应的右刮号内的所有内容
\3:引用第三个左刮号以及与之对应的右刮号内的所有内容
\4:引用第四个左刮号以及与之对应的右刮号内的所有内容
实例:grep '\([0-9]).*\1$' aa.txt
四、grep\egrep\fgrep 之间的关系
grep:在没有参数的情况下,只输出符合RE字符串之句子,常见的参数在“一”中
egrep:为grep的扩充版,改良了许多传统的grep不能或者不便的操作;such as:
--- grep 之下不支持?与+这两种字符,但是egerp可以得
--- grep 不支持a|b 或则 (abc | xyz) 这类“或一”比对,但是egerp可以
--- grep 在处理{n,m}时,需要{与}处理,但egrep不需要
五、字符集
[:alnum:] 数字字符 [:digit:] 数字字符 [:punct:] 标点符合字符 [:alpha:] 字母字符
[:graph:] 非空字符 [:space:] 空格字符 [:blank:] 空格与定位字符 [:lower:] 小写字母
[:upper:] 大写字符 [:cntrl:] 控制字符 [:print:] 可显示的字符 [:xdigit:] 16进制数字
六、实例
1、 grep 'h.\{0,4\}p$' a:匹配a文件中任意字符至少0次之多4次
2、 grep 'h.\{1\}p$' a :匹配a文件中任意字符1次
3、 grep 'h.\{1,\}p$' a :匹配a文件中任意字符至少1次
4、 grep -o -E'[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' grub.cfg 搜索IP地址
5、 grep --color -E'C|cat' a.txt
6、 ls | grep '[[^[:space:]]*[0-9]' 显示以数字结尾但是不包含空白的文件。
7、关于grep和egrep
如下通过常用实例来学习BRE和ERE匹配,源文件url.txt内容如下:
www.baidu.com
http://www.baidu.com
https://www.baidu.com
http://wwwbaiducom
baidu.com
baidu
匹配以http或者https开头,并且其后为:并且含有.的串
BRE匹配:
grep '^https\{0,1\}.*\..*' url.txt
ERE匹配:
grep -E '^https?.*\..*' url.txt
匹配结果如下:
http://www.baidu.com
https://www.baidu.com