grep、egrep及相应的正则表达式和用法
grep系:grep、egrep、fgrep,文本搜索工具,基于“PATTERN”对于给定的文本进行模糊搜索grep系默认工作于贪婪模式下。
grep系:
grep:利用正则表达式进行全局查找,并将匹配的行显示出来。
grep [OPTIONS] PATTERN [FILE...]
PATTERN:过滤条件,是由正则表达式元字符以及没有特殊含义的文本字符组成。
正则表达式的元字符:会被正则表达式的引擎解释为特殊含义,
pcre---perl语言的正则表达式引擎
基本的正则表达式:BRE
扩展的正则表达式:ERE
grep默认仅支持基本正则表达式
egrep默认仅支持扩展正则表达式
fgrep默认不开启正则表达式引擎
常用选项:
-i, --ignore-case :忽略文本字符的大小写
-v, --invert-match :反向匹配,最终显示的结果是PATTERN不能匹配的行
-c, --count :统计匹配PATTERN的所有的行数
-o, --only-matching :关闭贪婪模式,仅显示PATTERN能够匹配的内容
-q, --quiet, --silent: 安静模式,不输出任何匹配结果。
--color[=WHEN], --colour[=WHEN] :将匹配PATTERN内容以特殊颜色高亮显示
--color=outo
-E, --extended-regexp :扩展的正则表达式 grep -E 相当于 egrep
-F, --fixed-strings, --fixed-regexp :固定的正则表达式 grep -F 相当于 fgrep
-G, --basic-regexp :基本的正则表达式 egrep -G 相当于 grep
-P, --perl-regexp :使用PCRE(perl common regular expression)引擎
-A NUM, --after-context=NUM :在显示匹配PATTERN行的同时显示其后面的字符行
-B NUM, --before-context=NUM:在显示匹配PATTERN行的同时显示其前面的字符行
-C NUM, -NUM, --context=NUM:在显示匹配PATTERN行的同时显示其前后面各字符行
PATTERN:
正则表达式的元字符:
字符匹配:
. :匹配任意单个字符
例子:查看/etc/passwd目录下 显示包含roo后面加任意单个字符的行
[root@zj06 ~]# cat /etc/passwd | grep "roo."
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[] :匹配指定范围内的任意单个字符
例如:'[abc]' 可以匹配 "plain" 中的 'a'。
[^] :匹配指定范围以外的任意单个字符
例如:'[^abc]' 可以匹配 "plain" 中的'p'、'l'、'i'、'n'。
下列所有的字符集都可以放在中括号之中用于匹配单个字符
[:lower:]
例如:查看/etc/passwd目录下 显示包含任意小写字母的行
cat /etc/passwd | grep [[:lower:]] 例子下同
[:upper:]大写字母的行
[:alpha:]大小写字母的行
[:digit:]十进制数字的行
[:space:]水平和垂直的空白字符
[:alnum:]任意字母和数字
[:punct:]可打印字符
[:blank:]空白字符(空格和制表符)
[:xdigit:]所有的十六进制数字
a-z 所有的小写字母
A-Z 所有的大写字母
0-9 标识所有的十进制数字
次数匹配:
该类字符之前的那个字符可以出现的次数
* :其前面的字符可以出现任意次(0次,1次或者多次)
例如:查看/etc/passwd目录下,b前面有任意个a的行
cat /etc/passwd | grep --color "a*b" 举例下同
\? :表示其前面的字符可有可无(0次或者1次)
\+ :其前面的字符至少出现一次(1次或者多次)
\{m\} :其前面的字符必须出现m次
\{m,n\} :前面字符至少出现m次,至多出现n次 (m<n)
\{,n\} :其前面的字符至少出现0次,至多出现n次
例如:查看/etc/passwd目录下前面是1后面最少0最多跟三个1的行
cat /etc/passwd | grep "1\{,3\}"
\{m,\} :其前面的字符至少出现m次,多多益善
例如:查看/etc/passwd 目录下前面是1后面最少跟三个1的行
cat /etc/passwd | grep "1\{3,\}"
在正则表达式中,表示任意长度任意字符的方法: .*
例如:查看/etc/passwd 目录下每行包含o后面的全部内容
cat /etc/passwd | grep o.*
位置锚定字符:
行锚定:
行首锚定:^
例如:查看/etc/passwd 目录下以root开头的行
cat /etc/passwd | grep ^"root"
行尾锚定:$
字锚定:
字首锚定: \<或者\b
例如:查看/etc/passwd 目录下以ava开头的行
cat /etc/passwd | grep '\<ava'
字尾锚定: \>或者\b
例如:查看/etc/passwd 目录下以tcsh结尾的行
cat /etc/passwd | grep 'tcsh\>'
\b:旧版本中的锚定方法,建议不使用
对于正则表达式引擎来说,字是由非特殊字符组成的连续字符串
分组与引用字符:
\(PATTERN\) :将此PATTERN所匹配到的所有字符当做一个不可分割的整体来处理。
在正则表达式引擎中有一系列的内置变量,这些变量会保存所有分组内的字符信息,用于后项引用。这些变量依次是\1,\2,\3,......
pattern1\(pattern2\)pattern3\(pattern4\(pattern5\)\)
\1:pattern2
\2:pattern4
\3:pattern5
\1:第一组小括号中的pattern匹配到的字符
\2:第二组小括号中的pattern匹配到的字符
...
例如1: "\(ab\(cd\)mn\) \1 \2"【表示:(ab(cd))ab(cd)】
例如2:“\(a.b\).*\1" 【表示a.b.*a.b,如:amb hello anb】
例如3:【 表示"\(l..e\).*\1",找出前面以l..e开头,后面同包含一个l..e的行】
He like his lover.
He like his liker.
She love her lover.
She love her liker.
例如4:【表示:\(.*\)\.mp3.*\1\.wvm,找出中间包含#.mp3,而后又有#.wvm(#与前相同)的行】
play.php?a.mp3?search?a.wmv
play.php?where.mp3?hello?when.wmv
或:
\|
注意:\|字符将其左右两边的字符串当做整体来对待,
例如:找出"fdisk -l“命令的结果中,包含sda1或sda2的行
fdisk -l | grep 'sda1\|sda2'
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
默认情况下:grep命令后面只允许有一个pattern,
如果想要在一次grep搜索过程中写多个pattern,则需要-e选项,每个-e选项只能使用一个pattern作为参数。
将所需的pattern写入到一个文件中,保证每行只有一个PATTERN,我们就可以使用-f FILE方式来实现多PATTERN匹配
例如: grep -e "cat" -e "dog"
egrep
grep [OPTIONS] PATTERN [FILE...]
扩展的字符表达式元字符:
字符匹配:
.
[]
[^]
次数匹配:
* 任意次
? 0次或者1次
+ 至少一次
{m} 精确匹配m次
例如:匹配出现两个o的行
egrep o{2} /etc/passwd
{m,n} 至少m次,最多n次
{m,} 至少m次
{0,n} 至多n次
位置锚定:
^ 锚定行首
$ 锚定行尾
\<,\b 锚定词首
\>,\b 锚定词尾
分组和引用:
()
例如:包含至少一个ab的行
egrep '(ab)+' /etc/passwd
或:
|
例如:显示当前系统上root、fedora或user1用户的默认shell;
grep -E "^(root|fedora|user1)\>" /etc/passwd | cut -d: -f7
或 egrep "^(root|fedora|user1)\>" /etc/passwd | cut -d: -f7
fgrep:PATTERN中所有的字符都被当做文本字符来处理
其他的文件处理命令:
wc:
wc[OPTION]...[FILE]...
-l:只显示行数
-w:只显示字数
-c:只显示字符数
cut:remove sections from each line of files
能够被cut命令修剪的文件,一般都是具有一定结构或者格式的文本文档:/etc/passwd
cut OPTION... [FILE]...
-d, --delimiter=DELIM :指定在实施修剪操作时所依赖的分隔符,默认是空白符。
-f, --fields=LIST :根据定义的分隔符来指定字段的序号。
地址定界使用方法:
# :选择被指定的单个字段
#,# :离散的多个被指定的单个字段
#-# :连续的多个被指定的字段
--output-delimiter=STRING :指定输出分隔符
awk:
awk -F "DELIMITER" '[/PATTERN/]{print $1,$2,$3,...$NF}' FILE...
-F "DELIMITER" :指定字段分隔符,默认为空白字符
$1,$2,$3,...$NF :根据字段分隔符切割出来的文本片段都存放在相应的内部变量中。
sort:sort lines of text files将文本文件按行排序,默认的排序规则是按照ASCII表中的字符顺序进行的,这个排序标准可修改。
-R, --random-sort :随机排序,这种随机算法是非常简陋的不适用于复杂环境
-r, --reverse :逆序排序
-u, --unique :重复出现的行,只保留一行。(连续且完全相同的行 叫重复)祛重
-n, --numeric-sort :以数字的数值大小进行排序
-t, --field-separator=SEP :指定字段的分隔符
-k, --key=KEYDEF :指明根据哪个关键字段进行排序,一般和-t同时使用。
uniq:report or omit repeated lines 报告或者忽略重复的行
-d, --repeated :只显示重复出现的行,每一组重复出现的行只显示一行。
-u, --unique :只显示不重复的行。
-c, --count :在每行以前缀的方式显示重复行的重复次数
diff:compare files line by line
查看两个文件的差异性同一个文件的不同修改版本:打补丁
patch:apply changes to files 接受文件的改变
patch [-R][-i patchfile] [file]