shell编程三剑客之grep与正则表达式
一 grep工具
grep是行过滤工具,用于根据关键字进行行过滤
语法:
grep -选项 “关键字” 文件名
1.1 常用选项
选项 | 含义 |
---|---|
-i | 不区分大小写 |
-v | 查找不包括关键字的行,即反向选择 |
-w | 按单词进行搜索,匹配有且仅有的字符 |
-o | 仅显示匹配到的字符串 |
-c | 统计匹配到的次数 |
-n | 显示行号 |
-r | 逐层遍历目录查找 |
-A n | 显示匹配行及后面(after)n行 |
-B n | 显示匹配行及前面(before)n行 |
-C n | 显示匹配行及前后n行 |
-e | 使用正则表达式 |
-E | 使用扩展正则表达式 |
-P | 匹配数字、字母或字符串 |
1.2 选项解释
测试文本内容如下
grep -w
命令: grep -w ‘cen’ sedtest.txt
由图可见,在不包含选项-w的时候,只要文本中有“cen”就会过滤出来,而加上-w之后需要文本中存在这个单词才会过滤出来
grep -o
命令: grep -o ‘cenjeal’ sedtest.txt
由图可见,不包含-o的时候会输出一整行,而使用-o选项后则只显示匹配的字符串
grep -P
命令:grep -P ‘\d’ sedtest.txt 匹配数字
命令:grep -P ‘\w’ sedtest.txt 匹配字母数字下划线
命令:grep -P ‘\s’ sedtest.txt 匹配字符串
二 正则表达式
2.1 正则表达式的含义
正则表达式(Regular Expression、regex或regexp,缩写为RE),也译为正规表示法、常规表示法,是一种字符模式,用于在查找过程中匹配指定的字符。
支持正则表达式的程序如:find| vim| grep| sed |awk
2.2 正则表达式的应用场景
1.匹配邮箱、匹配身份证号码、手机号、银行卡号等
2.匹配某些特定字符串,做特定处理等等
2.3 正则表达式名词解释
元字符
指那些在正则表达式中具有特殊意义的专用字符,如:点(.) 星(*) 问号(?)等
前导字符
位于元字符前面的字符. abc* aooo.
2.4 第一类正则表达式
普通常用元字符
元字符 | 功能 | 示例 |
---|---|---|
. | 匹配除了换行符以外的任意单个字符 | |
* | 前导字符出现0次或连续多次 | |
.* | 匹配任意长度字符 | |
^ | 行首(以…开头) | ^root |
$ | 行尾(以…结尾) | root$ |
^$ | 匹配空行 | 常用 |
[] | 匹配括号里任意单个字符或一组单个字符 | [abc] |
[^] | 匹配不包含括号里任一单个字符或一组单个字符 | [^abc] |
^[^] | 匹配不以括号里任意单个字符或一组单个字符开头 | ^[^abc] |
其他常用元字符
元字符 | 功能 | 示例 |
---|---|---|
\< | 取单词的头 | grep ‘\<hel’ 1.txt |
\> | 取单词的尾 | grep ‘rld\>’ 1.txt |
\< \> | 精确匹配 | grep ‘\<hello\>’ 1.txt |
\{n\} | 匹配前导字符连续出现n次 | |
\{n,\} | 匹配前导字符至少出现n次 | |
\{n,m\} | 匹配前导字符出现n次与m次之间 | |
\( \) | 保存被匹配的字符 | sed ‘s/(10.1.1.).1/\1.254/g’ 1.txt |
\d | 匹配数字(grep -P) | [0-9] |
\w | 匹配字母数字下划线(grep -P) | [a-zA-Z0-9_] |
\s | 匹配空格、制表符、换页符(grep -P) | [\t\r\n] |
常用扩展元字符
grep必须加 -E 或者使用egrep
sed必须加 -r
扩展元字符 | 功能 | 示例 |
---|---|---|
+ | 匹配一个或多个前导字符 | |
? | 匹配零个或一个前导字符 | |
| | 或 | 匹配a或b |
() | 组字符(看成整体) | (my|your)self:表示匹配myself或匹配yourself |
{n} | 前导字符重复n次 | |
{n,} | 前导字符重复至少n次 | |
{n,m} | 前导字符重复n到m次 |
2.5 第二类正则表达式
扩展元字符 | 功能 | 示例 |
---|---|---|
[:alnum:] | 字母与数字字符 | [[:alnum:]]+ |
[:alpha:] | 字母字符(包括大小写字母) | [[:alpha:]]{4} |
[:blank:] | 空格与制表符 | [[:blank:]]* |
[:digit:] | 数字 | [[:digit:]]? |
[:lower:] | 小写字母 | [[:lower:]]{4,} |
[:upper:] | 大写字母 | [[:upper:]]+ |
[:punct:] | 标点符号 | [[:punct:]] |
[:space:] | 包括换行符,回车等在内的所有空白 | [[:space:]]* |