一、linux文本处理三剑客介绍
linux中文本三剑客包括grep(egrep,fgrep),sed,awk,三者基本的功能如下:
工具名称 | 功能 |
grep,egrep,fgrep | 文本过滤工具(搜索工具) |
sed | stream editor, 流编辑器;文本编辑工具 |
awk | 文本报告生成器 |
二、grep工具详解
1、grep的介绍:
grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
grep主要包含以下三个命令:
grep:支持使用正则表达式
egrep:支持使用扩展正则表达式
fgrep:不支持正则表达式
备注:egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的RE元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。
2、grep的使用:
grep命令的使用模式主要有2种:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
接下来我们针对命令选项(options)做出详细的说明,模式(pattern)指的是正则表达式,我将在后面对其进行单独解释。
grep的选项主要有:
--color[=WHEN]:对匹配到的文本着色后高亮显示;
[WHEN]的值主要有:never,always,auto,系统默认的是auto,可以使用alias命令查询:
-i:ignorecase,忽略字符的大小写
-o:仅显示匹配到的字符串本身;
-v, --invert-match:显示不能被模式匹配到的行;
-q, --quiet, --silent:静默模式,即不输出任何信息,可使用"$?"查询执行状态。
-A #:after, 后#行
-B #:before,前#行
-C #:context,前后各#行
-e:可以匹配多个模式:
-n:查找出来的结果显示行号:
-f file:以某个文件中的内容作为pattern,进行查询
-E:支持使用扩展的正则表达式元字符;
此命令等同于直接使用egrep。
-F:不支持使用正则表达式元字符;
此命令等同于直接使用fgrep
三、grep与正则表达式使用
1、什么是正则表达式
正则表达式(也称为 “regex” 或 “regexp”)是一种描述文本字符串或模式的方式,它主要由元字符和一般字符组成。
在这里我们需要与shell的元字符区别开来,其实也是比较容易区别开的,shell的元字符主要作用于命令的,如下:
shell元字符 | |
$ | 作变量或运算替换 |
> | 重导向标准输出 |
< | 重导向标准输入 |
| | 命令管道 |
( ) | 用于运算或命令替换 |
; | 在前一个命令结束时,而忽略其返回值,继续执行下一个命令 |
&& | 在前一个命令结束时,若返回值为 true,继续执行下一个命令 |
|| | 在前一个命令结束时,若返回值为 false,继续执行下一个命令 |
! | 执行 history 列表中的命令 |
shell 元字符,基本是作用在命令上面,本文就不再一一赘述。 |
正则表达式的元字符可以分为三类:
字符匹配
元字符 | 表示内容 |
. | 匹配任意单个字符 |
[] | 匹配指定范围内的任意单个字符 |
[^] | 匹配指定范围外的任意单个字符 |
[:digit:] | 数字,与[0-9]等价 |
[:lower:] | 小写字母,等同于[a-z] |
[:upper:] | 大写字母,等同于[A-Z] |
[:alpha:] | 字母,等同于[A-Za-z] |
[:alnum:] | 字母和数字,等同于[A-Za-z0-9] |
[:punct:] | 标点符号 |
[:space:] | 空白字 |
次数匹配
元字符 | 表示内容 |
* | 匹配其前面的字符任意次;0,1,多次 |
.* | 匹配任意长度的任意字符 |
\? | 匹配其前面的字符0次或1次;即其前面的字符是可有可无的 |
\+ | 匹配其前面的字符1次或多次;即其面的字符要出现至少1次 |
\{m\} | 匹配其前面的字符m次 |
\{m,n\} | 匹配其前面的字符至少m次,至多n次 |
位置锚定
元字符 | 表示内容 |
^ | 行首锚定;用于模式的最左侧 |
$ | 行尾锚定;用于模式的最右侧, |
\< 或 \b | 词首锚定,用于单词模式的左侧 |
\> 或 \b | 词尾锚定,用于单词模式的右侧 |
2、正则表达式的使用
要熟练的使用正则表达式,需要对其元字符有充分的理解,下面就对元字符的实际使用进行一一介绍:
1、字符匹配:
. : 匹配任意单个字符,如下图:
[]:匹配指定范围内的任意单个字符,如下图:
[^]:匹配指定范围外的任意单个字符
[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]:数字,小写字母,大写字母,字母,字母和数字,符号,空白字符。
2、次数匹配:
*:匹配其前面的字符任意次;0,1,多次
.*:匹配任意长度的任意字符.
\? : 匹配其前面的字符0次或1次;即其前面的字符是可有可无的
\+ : 匹配其前面的字符1次或多次;即其面的字符要出现至少1次
\{m,n\} 匹配其前面的字符至少m次,至多n次
3、 位置锚定
^: 行首锚定;用于模式的最左侧
$:行尾锚定;用于模式的最右侧
\< 或 \b:词首锚定,用于单词模式的左侧
\> 或 \b:词尾锚定,用于单词模式的右侧
4、分组与引用
\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理,分组括号中的模式匹配 到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为\1,\2...。
3、扩展正则表达式
扩展正则表达式与正则表达式最大不同的地方是,有些特殊的符号,不需要转义符(\)转移,可直接使用,以下是扩展正则表达式的元字符列表:
字符匹配
元字符 |
表示内容.匹配任意单个字符[]匹配指定范围内的任意单个字符[^]匹配指定范围外的任意单个字符[:digit:]数字,与[0-9]等价[:lower:]小写字母,等同于[a-z][:upper:]大写字母,等同于[A-Z][:alpha:]字母,等同于[A-Za-z][:alnum:]字母和数字,等同于[A-Za-z0-9][:punct:]标点符号[:space:]空白字与正则表达式的元字符相同
次数匹配
元字符 | 表示内容 |
* | 匹配其前面的字符任意次;0,1,多次 |
.* | 匹配任意长度的任意字符 |
? | 匹配其前面的字符0次或1次;即其前面的字符是可有可无的 |
+ | 匹配其前面的字符1次或多次;即其面的字符要出现至少1次 |
{m} | 匹配其前面的字符m次 |
{m,n} | 匹配其前面的字符至少m次,至多n次 |
其中的转义符都可以去掉,使用方法一样。 |
位置锚定
^ | 行首锚定;用于模式的最左侧 |
$ | 行尾锚定;用于模式的最右侧, |
\< 或 \b | 词首锚定,用于单词模式的左侧 |
\> 或 \b | 词尾锚定,用于单词模式的右侧 |
锚定词首词尾的转义符不可省略。 |
分组或引用
():将次PATTERN匹配到的字符当做一个整体处理;分组括号中的模式匹配到的字符会被正则表达式引擎自动纪录于变量中,这些变量分别是\1,\2,\3, 元字符的转义符可省略,但引用时的\1,\2不可省略
或:
| :a|b:a或b
c|cat :c或cat
(c|c)at:c或c
以下是几个实例:
找出/proc/meminfo文件中,所有以大写或小写S开头的行
找出ifconfig命令结果中的1-255之间的数值
原文地址:http://bolly.blog.51cto.com/4460561/1750278