linux文本处理三剑客之grep

来源:互联网 发布:java 如何打包jar文件 编辑:程序博客网 时间:2024/06/06 03:22

grep简介

grep:英文缩写Global search Regular Expression and Print out the line(全面搜索正则表达式并把行打印出来),是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

正则表达式

正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一组特殊字符,组成一个“规则字符集合”,根据用户指定的文本模式对目标文件进行逐行搜索匹配,显示能被模式匹配到的结果。

给定一个正则表达式和另一个目标字符串,我们可以从给定的字符串中通过匹配模型,过滤字符串中不想要的的字符串,得到目标字符串,减少工作量。

正则表达式分类

GUN/linux下grep包括 grep、egrep和 fgrep
- egrep是grep的扩展,等同grep -E
- fgrep就是fixed grep或fast grep,等同grep -F不使用任何正则表达式,直接进行字符串匹配

常用的正则表达式一般为基本正则表达式grep和扩展正则表达式egrep。
扩展正则表达式与基础正则表达式的唯一区别在于:? + () {} 这几个字符。

基础正则表达式中,如果你想? + () {}表示特殊含义,你需要将他们转义,
而扩展正则表达式中,如果你想? + () {} 不表示特殊含义,你需要将他们转义。
如下例子:

[echo@localhost]$ echo aaaa | grep  'a?'[echo@localhost]$ echo aaaa | grep  '\a?'aaaa[echo@localhost]$ echo aaaa | grep -E 'a?'aaaa[echo@localhost]$ echo aaaa | egrep ' a?'aaaa

语法

grep [OPTION] PATTERN [FILE]…

-o:只显示被模式匹配到的内容
-i:ignore case,不区分字符大小写
-E:使用扩展的正则表达式
-w:匹配一个完整的单词
-v:没有匹配到的行
-n:打印出匹配字符串的在文件中的行号
--color:对匹配的字符串着色打印
-5:匹配字符及前后各5行
-A 5:匹配字符及后5行,同-C 5
-B 5:匹配字符及前5行

 grep -oin 'root' /etc/passwd   #显示行号,不区分大小写只匹配到字符本身

字符匹配

.:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
[0-9]:匹配数组 0-9 的任意一个
[0-z]:匹配任一数字及小写字母
[0-Z]:匹配任一数字及大小写字母
[[:digit:]]:匹配任意单个数字
[[:lower:]]:匹配任意单个小写字母,等同[a-z]
[[:upper:]]:匹配任意单个大写字母,等同[A-Z]
[[:space:]]:匹配任意单个空白字符
[[:punct:]]:匹配任意单个标点符号
[[:alpha:]]:匹配任意单个英文字母
[[:alnum:]]:匹配任意单个字母或数

grep  [^0-9[:lower:]]  /etc/passwd      # 匹配除数字和小写字母以外的字符

匹配次数

*: 匹配前面的字符任意次
.*:匹配任意次 ,即匹配任意长度的任意字符
\? :匹配前面的字符 0 次或者 1 次
\+: 匹配前面的字符 1 次或多次
\{m\}:匹配前面的字符 m 次
\{m,n\}:匹配前面的字符至少 m 次,至多 n 次
\{m,\}:匹配前面的字符至少 m 次
\{,n\}:匹配前面的字符至多 n 次

grep "[0-9]\+.*[[:punct:]]\{3,\}" /etc/passwd    # 至少一个数字及3个以上标点符号

位置锚定

^:锚定行首
$:锚定行尾
\<\b:锚定词首
\>\b:锚定词尾

grep -n "^[[:space:]]\+$" mydata.txt                  # 找出空白行的行号grep "^#[[:space:]]\{1,\}[^[:space:]]" /etc/inittab   # 以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行grep '^\([0-9]\).*\1$' /etc/inittab                   # 一个数字开头并以一个与开头数字相同的数字结尾的行

分组引用

以使用括号\(***\)将一组字符括起来,表示这一组字符被当作一个整体,还可以使用 \1, \2… 对前面括号匹配所匹配的字符串进行引用

# 首个单词和最后一个单词一样的行grep "^\(\# 匹配包含mysql或apache或redis的行,`|`表示或 egrep "mysql|apache|redis" mydata.txt # 匹配ipv4的地址 egrep "(\# 取出默认shell为bash,且其用户ID号最小的用户的用户名 grep 'bash$' /etc/passwd | sort -n -t: -k3 | head -1 | cut -d: -f1
原创粉丝点击