文本查找的需要:
grep:global research,根据模式,搜索文本,并将符合模式的文本行显示出来。
egrep,fgrep
pattern:模式英文,文本字符和正则表达式的元字符组合而成匹配条件。
grep [optians] [pattern] file...
-i --ignore-case 忽略大小写
--color
-v 反向查找 被模式匹配的行不显示
-o 只显示被模式匹配到的字符串
* :任意长度的任意字符
?:任意单个字符
[]:指定范围内的
[^]:指定范围外的
正则表达式:Regular EXPression,REGEXP
grep 'pattern' file
元字符:
.:匹配任意单个字符;
[]:匹配指定范围的任意单个字符
[^]:匹配指定范围外的单个字符
[:lower:],[:upper:],[:punct:],[:space:],[:alpha:],[:alnum:],[:digit:]
匹配次数:
*:匹配其前面的字符任意次
a,b,ab,aab,acb,adb,amnb
a*b
a.*b
.*:任意长度的任意字符
\?:做次数匹配,匹配其前面的字符一次或零次
正常工作在贪婪模式下,尽可能长的去匹配
\{m,n\}:匹配其前字符至少M次,至多N次
\{1,\}至少一次
\{0,3\} 最多三次
grep 'a\{1,3\}b a
位置锚定:
^:锚定行首,此字符后面的任意内容必须出现在行首。
grep '^r..t' /etc/passwd
$:锚定行尾,此字符前面的任意内容必须出现在行尾
grep 'y$' /etc/inittab
grep 'b..h$' /etc/passwd
^$:空白行
锚定词首:
\<: 其后面的任意字符必须作为单词,首部出现,锚定词首
\>:其前面的任意字符必须作为单词,尾部出现,锚定词尾
\<root\>
\broot\b =\<root\>,可以使用b代替<,>
分组:
\(\)
\(ab\)* ab可以出现0次,1次,任意次
grep '\(l..e\).*\(l..e\)' a 匹配以l..e的,并且中间是任意字符
\2:
\3:
grep '\([0-9]\).*\1$ /etc/inittab 行中出现数字并且以相同数字结尾的
grep '\(^[0-9]\).*\1$ /etc/passwd 以首先开关的数字并且以相同数字结尾的
练习:分析/etc/inittab文件中如下文件中前两行的特征(每一行中出现数字必须相同),请写出可以精确找到类似两行的模式:
11:1:wait:/etc/rc.d/rc 1
13:3:wait:/etc/rc.d/rc 3
grep '^1\([0-9]\).\1.*\1$'
正则表达式:
Basic REGEXP:基本
Extended REGEXP:扩展
基本正则表达式:
.:任意单个字符
[]:指定范围
[^]:指定范围以外的
次数匹配:
*:其前的任意次
\?:0次或者1次
\{m,n\)}:至少M次,到多N次
.*:任意长度的字符
锚定:
^:行首
$:行尾
\<,\b:后面的任意单词,必须出现在首部
\>,\b:前面的任意单词,必须出现在尾部
\(\)用于分组的
\1,\2,\3.....用于后向引用
grep:使用基本正则表达式定义的模式来过滤文本的命令
-i
-o 只显示匹配到的字符串
--color
-E :使用扩展正则表达式
-A#(数值):当某一行被grep指定的模式匹配后,
grep -A 2 '^core id' /proc/cpuinfo 后面的2行
-B:
grep -B 2 '^core id' /proc/cpuinfo 前面2行
-C:-C2 前后各2行
扩展正则表达式:
字符匹配:与基本一样
.
[]
[^]
次数匹配
*:与基本一样
?:其前一次或零次
+:其前字符至少一次,匹配其前面字符至少1次
+*近似*
{m,n},不需要使用\,直接使用
位置锚定与基本一样
分组:
():分组
\1,\3,....
|:或者:a|b or的意思
grep --color -E c|cat a.txt
egrep '\b([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-9]\b'
ifconfig | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}'
ifconfig | grep -o '\b[0-9]\{1,3\}\b\.\b[0-9]\{1,3\}\b'
-o 匹配串本身
ifconfig eth0 | grep -o '\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}'
ifconfig ens160 | sed -nr 's/inet (.*) net.*/\1/p'
ifconfig ens160 | grep -Po '(?<=inet)(.*)(?=net)'
cat /etc/inittab | grep '^#$' | wc -l
cat /etc/inittab | grep '^#$'
IPV4:
5类:A B C D E
A:1-127
B:128-191
C:192:223
fgrep:fast,不支持正则表达式