欢迎各位兄弟 发布技术文章
这里的技术是共享的
文本查找(文本检索):
grep , egrep , fgrep
grep : 根据模式 搜索文本 并将符合模式(本身的意义就是做部分匹配的,不需要整个行匹配)的文本行显示出来 Global Research
Pattern:文本字符和正则表达式的元字符给合而成的匹配条件
grep [OPTIONS] PATTERN [FILE...]
-i --ignore-case 忽略大小写
--colour[=WHEN]--color[=WHEN] 在什么情况下匹配到了显示颜色
-v 反向查找 显示没有被模式匹配到的行 没有匹配到的行反而显示出来.匹配到的反而不显示
-o 只显示被模式匹配到的字符串,每一个串显示一行 (不显示整个行)
-R 目录下递归查找
-n 显示行号
文件名通配 globbing (通配符的意思)
*: 星号任意长度的任意字符
?: 问号任意单个字符
[]:中括号指定范围内
[^]:中括号里有尖号指定范围外 (不包括)
正则表达式: REGular EXPression,REGEXP 通配符,可能还有别的意义
元字符:
. : 点号表示匹配任意单个字符
[]: 中括号,指定范围内的任意单个字符
[^]: 中括号内含拖字符,指定范围外的任意单个字符(不包括里面的任意单个字符) (取反的)
字符集合: [:digit:]数字 [:lower:] 小写字母[:upper:]大写字母 [:punct:] 标点符号 [:space:]空白字符 [:alpha:]所有字母 [:alnum:]所有字母和所有数字
匹配次数数: (默认贪婪模式)
* : 星号表示匹配其前面的字符任意次
a , b, ab , aab , acb , adb , amnb
a*b a出现任意次(可以是零次)后面跟了个b 上一行红色的字都可以匹配,其它的都不匹配
a.*b a 后面跟任意长度的任意字符再跟个b,上面的 有下划线的都匹配,
.* 点号星号(点星号)表示任意长度的任意字符(可以是零次) 它是通吃的 (默认情况下 正则表达式工作在贪婪模式下,也就是说尽可能的匹配)
\? : 反斜杠问号,表示匹配其前面的字符1次或0次 (很可能需要使用反斜线进行转义才能使用) (也是作匹配次数使用的)
\{m,n\}:表示匹配其前面的字符,至少m次,至多n次 (反斜杠是转义的意思,假如不加反斜杠,花括号就会被shell解析(解释),bash中,花括号就是命令行展开,加上转义的反斜杠后,告诉bash别展开,当正则表达式来使用)
\{1,\} 表示匹配其前面的字符至少一次,多了不限
\{0,3\} 表示匹配其前面的字符至少0次,至多3次
位置锚定:
^: 尖号(拖字符) 锚定行首 此字符后面的任意内容必须出现在行首
$: 美元符号 锚定行尾 此字符前面的任意内容必须出现在行尾
^$ : 空白行 空行
\< 或 \b:锚定词首,其后面的任意字符必须作为单词的首部出现 (r55t 可看作一个单词, r::5不可看作一个单词)
\> 或 \b:锚定词尾,其前面的任意字符必须作为单词的尾部出现
\<root\> 找 root 这个单词 作为词首,词尾均需满足,只能作为一个单词来看待
分组:
\(\)
\(ab\)* ab 可以出现一次或零次或任意次
后向引用 (前向引用)
\1 : 表示前面第一个括号中出现的内容 (引用第一个左括号以及与之对应的右括号所包括的所有内容) (就算括号里有嵌套,也是从左往右数,第一个左括号表示\1,第二个左括号表示\2)
\2 :
\3 :
He love his lover.
She like her liker.
He like his lover.
l..er
# man grep
单引号 强引用 双引号 弱引用 其实这里只要不涉及到变量的使用 单双引号都可以
如果不涉及到有关正则表达式的元字符的话 不加引号也可以
# grep 'root' /etc/passwd
[root@ebs-22618 ~]# grep -i 'root' /etc/passwd
[root@ebs-22618 ~]# grep --color 'root' /etc/passwd
[root@ebs-22618 ~]# alias grep='grep --color' 给检索颜色起个别名
[root@ebs-22618 ~]# grep 'root' /etc/passwd
[root@ebs-22618 ~]# grep -v 'root' /etc/passwd
[root@ebs-22618 ~]# grep -o 'root' /etc/passwd
[root@ebs-22618 ~]# grep -Rn 'root' /etc/passwd
[root@ebs-22618 ~]# grep 'r..t' /etc/passwd 检索r和t中间跟了两个字符的
[root@ebs-22618 ~]# nano test.txt
[root@ebs-22618 ~]# grep 'a.*b' test.txt
[root@ebs-22618 ~]# grep 'a*b' test.txt
[root@ebs-22618 ~]# grep 'a\?b' test.txt
[root@ebs-22618 ~]# grep 'a\{1,3\}b' test.txt
[root@ebs-22618 ~]# grep 'a.\{1,3\}b' test.txt
[root@ebs-22618 ~]# grep 'r..t' /etc/passwd
[root@ebs-22618 ~]# grep '^r..t' /etc/passwd
[root@ebs-22618 ~]# grep 'w$' /etc/inittab
[root@ebs-22618 ~]# grep 'b..h$' /etc/passwd
[root@ebs-22618 ~]# cat /tmp/aaaa.txt
[root@ebs-22618 ~]# grep '^$' /tmp/aaaa.txt
[root@ebs-22618 ~]# grep '^$' /tmp/aaaa.txt | wc -l
[root@ebs-22618 ~]# grep '[[:digit:]]$' /etc/inittab 匹配以一个数字结尾的
[root@ebs-22618 ~]# grep '[[:space:]][[:digit:]]$' /etc/inittab 匹配以一个空格加一个数字结尾的
当然多个空格加一个数字结尾的肯定也能匹配到
[root@ebs-22618 ~]# nano test2.txt
[root@ebs-22618 ~]# grep "root\>" test2.txt
[root@ebs-22618 ~]# grep "\<root" test2.txt
[root@ebs-22618 ~]# grep "\<root\>" test2.txt
\< 和 \> 可以用 \b 来代替
[root@ebs-22618 ~]# cat test.txt
[root@ebs-22618 ~]# grep "\(ab\)*" test.txt
[root@ebs-22618 ~]# nano test3.txt
[root@ebs-22618 ~]# grep 'l..e' test3.txt
[root@ebs-22618 ~]# grep 'l..e.*l..e' test3.txt
[root@ebs-22618 ~]# nano test3.txt
[root@ebs-22618 ~]# grep '\(l..e\).*\1' test3.txt
[root@ebs-22618 ~]# grep '\([0-9]\).*\1$' /etc/inittab