文本查找(grep,egrep,fgrep)
grep:Global Research根据模式去搜索文本,并将符合模式的文本行显示出来。
Pattern(模式):由文本字符和正则表达式的元字符所组合而成的匹配条件
- grep [options] PATTERN [FILE...] 如:grep 'root' /etc/passwd
-i:忽略大小写(ignore case)
--color
-v:显示没有被模式匹配到的行
-o:只显示被模式匹配到的字符串
- 正则表达式:REGular EXpression REGEX
- 正则表达式:里面有一些元字符,这些元字符不是其本身的意义,而有通配的意义。
与学习bash的基本概念中的文件通配符不同,在文件通配中:
星号 * :可以匹配任意长度的任意字符
?:匹配任意单个个字符
[ ] :匹配指定范围内的任意单个字符
然而元字符与之不同。
元字符:
. : 匹配任意单个字符
[ ] : 匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
字符集合:[:digit:], [:lower:], [:upper:], [:punct:], [:space:], [:alpha:], [:alnum:]
匹配次数(贪婪模式,尽可能长的匹配):
星号 ※:匹配其前面的字符任意次
例如:a, b, ab, aab, acb, adb, amnb
a * b :b,ab,aab
a . b:aab,acb,adb
a. * b :ab, aab, acb, adb, amnb
a/?b:
.*: 任意长度的任意字符
\?: 匹配其前面的字符1次或0次(使用时加上 ' ')
\ { m , n \ }:匹配其前面的字符至少m次,至多n次
\ { 1 , \ }:最少一次
\ { 0 , 3 \ }:最多三次
-
位置锚定:(必须出现在某个位置)
^: 锚定行首,此字符后面的任意内容必须出现在行首
grep '^r..t' /etc/passwd
$: 锚定行尾,此字符前面的任意内容必须出现在行尾
grep 'b..h$' /etc/passwd
^$: 空白行正则表达式中词的概念:11adc11像这种数字单词组合在一起的也相当于词,词中特殊字符的话不算一个词。 \>或\b: 锚定词首,放在最前面,其后面的任意字符必须作为单词的首部出现 \<或\b: 锚定词尾,放在最后面,其前面的任意字符必须作为单词的尾部出现 分组: \(\):将内容进行分组 \(ab\)*:把ab当作一个组,ab可以出现一次,零次或任意一次。 后向引用 \1: 引用第一个左括号以及与之对应的右括号所包括的所有内容 \2: \3:
扩展正则表达式(grep -E或egrep,grep -E = egrep )
REGEXP:REGular EXPression
Pattern(模式):由文本字符和正则表达式的元字符所组合而成的匹配条件
正则表达式:
Basic REGEXP:基本正则表达式
Extended REGEXP:扩展正则表达式
他们所支持的元字符有一部分不一样,甚至有些元字符的意义也不相同。
grep:使用基本正则表达式定义的模式来过滤文本的命令;
-i :忽略大小写(ignore case)
-v:显示没有被模式匹配到的行
-o:只显示被模式匹配到的字符串
--color
-E: 使用扩展正则表达式
-A n:不但显示匹配到的行,还像是这行的后n行(after)
-B n:不但显示匹配到的行,还像是这行的前n行(before)
-C n:不但显示匹配到的行,还像是这行的前后n行
扩展正则表达式:
-
字符匹配(与基本正则表达式相同):
. : 匹配任意单个字符
[ ] : 匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符次数匹配(与基本正则表达式有些不同): *: 匹配其前面的字符任意次 ?:不需要加反斜线,匹配其前面的字符1次或0次 +: 匹配其前面的字符至少1次 ( 相当于 \ ( 1 , \ )) {m,n}:不需要使用反斜线,匹配其前面的字符至少m次,至多n次 位置锚定:(与基本正则表达式相同) ^: 锚定行首,此字符后面的任意内容必须出现在行首 $: 锚定行尾,此字符前面的任意内容必须出现在行尾 ^$: 空白行 \>或\b: 锚定词首,放在最前面,其后面的任意字符必须作为单词的首部出现 \<或\b: 锚定词尾,放在最后面,其前面的任意字符必须作为单词的尾部出现 分组:不需要加反斜线,与基本正则表达式相同 ():分组 \1, \2, \3, ... 或者(扩展正则表达式的特殊字符) |:or C|cat:C或cat (C|c)at:Cat或cat(分组的用法) grep -E = egrep
练习:
-
显示所有以数字结尾且文件名中不包含空白的文件:
ls [^[:space:]][0-9] ????????? -
找出ifconfig命令结果中的1-255之间的整数:使用ifconfig通道加egrep
ifconfig | egrep --colour ’\<([ 1 - 9 ] | [ 1 - 9 ] [ 0 - 9 ] | 1 [ 0 - 9 ] [ 0 - 9 ] | 2 [ 0 - 4 ] [ 0 - 9 ] | 25 [ 0 - 5 ])\>’
(使用或字符将0-9,10-99,100-199,200-249,250-255这四个范围或起来,再加上词首词尾锚定,注意加括号!!!) - 找出ifconfig命令结果中合适的ip地址:(首先得匹配0-255,其次还得匹配ip地址中间的 . 点这个字符)
加 / . 表示的就是匹配点这个字符
ifconfig | egrep -o '\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\> . \<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\> . \<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\> . \<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>' - 或者也可以简写成
ifconfig | egrep --color '(\<([0-9] | [1-9][0-9] | 1[0-9][0-9] | 2[0-4][0-9] | 25[0-5])\> .){3} \<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]) \> '
(先重复三次因为四个数字只有三个点字符,在加上一次匹配0-255)
IP简述
IPv4: 分五类A B C D E,有用的只有A,B,C
A:1-127
B:128-191
C:192-223
使用正则表达式找出可用的ip地址:
\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])\>(.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>){2}.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>
grep,egrep,fgrep:文本查找
文件查找:
-
locate:
非实时,模糊匹配,查找是根据全系统文件数据库进行的;
系统刚装好时,可能实行不了这个命令,要用updatedb, 手动生成文件数据库命令。
速度快但不精确。 -
find:
实时,精确
支持众多查找标准,支持正则表达式
遍历指定目录中的所有文件完成查找,速度慢; -
find 查找路径 查找标准 查找到以后的处理运作
查找路径:默认为当前目录
查找标准:默认为指定路径下的所有文件
处理运作:默认为显示 -
匹配标准:
-name 'FILENAME':根据文件名作精确匹配 文件名通配:比如 find /etc -name '*passwd*'比配在/etc下文件名有passwd的文件 *:任意长度的任意字符 ?:任意单个字符 [ ]:指定范围内的任意单个字符 -iname 'FILENAME': 文件名匹配时不区分大小写 -regex PATTERN:基于正则表达式进行文件名匹配 -user USERNAME: 根据属主查找 -group GROUPNAME: 根据属组查找 -uid UID: 根据UID查找 -gid GID: 根据GID查找 -nouser:查找没有属主的文件 -nogroup: 查找没有属组的文件
转载于:https://blog.51cto.com/13691207/2105511