一、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内容如下: baidu.com baidu 匹配以http或者https开头,并且其后为:并且含有.的串 BRE匹配: grep '^https\{0,1\}.*\..*' url.txt ERE匹配: grep -E '^https?.*\..*' url.txt 匹配结果如下:
|