linux正则表达式和grep命令
linux正则表达式和grep命令
在linux中,因为一切都是文件,所以文本操作占有很大的比重,正则表达式是一门处理文本的强大的工具。
正则表达式用来识别文本,和匹配文件或者路径名的shell通配符比较相似。许多命令行工具都能提供对正则表达式的支持,其中grep是用得最多的工具。
grep的用法
grep search_phrase filename
在filename表示的文件中查找包含search_phrase的文件。grep的主要选项如下:
选项 | 作用 |
-i | 忽略大小写,查询文本不区分大小写 |
-v | 不匹配,反向作用。通常grep会打印包含查询文本的文件,加上改选项会打印不包含该文本的文件 |
-c | 打印匹配文件的数量 |
-l | 打印包含查询文本的文件名,而不是文本行,默认是文本行 |
注:grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(pattern)进行匹配查找。和find结合使用的时候grep也是在find命令的输出的文件的内容中查找。
正则表达式
正则表达式和shell通配符一样也包含许多特殊字符,除了这些特殊字符之外其余的全是原义字符。
特殊字符
字符 | 作用 |
^ | 1.^在字符串开头时表示文本开头 2.^在[]中的第一个位置时表示否定,其他位置时是普通字符 |
$ | 1.字符末尾 2.变量值获取 |
. | 任意单个字符 |
[] | 括号中的任意一个单个字符,特殊字符在[]中失去特殊含义,除了^和-在指定的位置时。 |
{} | 匹配特定的次数(重复)。在bash中还可以表示命令集合或者目录分隔。 |
- | 在[]中非第一个和最后一个位置时表示范围。具体的值和特定的语系有关。 |
? | 表示0个或一次(重复) |
* | 任意多次重复(重复)。在bash中代表任意长度的任意字符串。 |
+ | 至少一次的重复(重复) |
() | 分组符。在bash中表示子shell指定的命令。 |
| | 逻辑或。在bash中表示管道。 |
\ | 特殊字符转义符。 |
当我们在bash中传递包含元字符的正则表达式的时候,把特殊字符用单引号引起来至关重要,这样可以阻止 shell 试图展开它们。
下面就来解释一下语系与正则表达式[]范围的关系:
正则表达式是处理字串的表示方式,那么对字符的排序有影响的语系配置就会对正则表达式产生影响。
举例来说,英文和数字的编码顺序在en_US.utf8
及 C 这两种语系的输出结果分别如下:
LANG=C:0 1 2 3 4 ... A B C D ... Z a b c d ...z
LANG=en_US.utf8:0 1 2 3 4 ... a A b B c C d D ... z Z
从上面可以发现不同的语系中字符的排序是不一样的。如果你想要获取大写的字符而使用 [A-Z] 时,会发现LANG=C(或者POSIX)时是连续的大写字符。
但是如果使用en_US.utf8时,会发现会取出除了小写a以外的所有字母。因为排序的顺序是【A b B c C d D ... z Z】。
所以,使用这则表达式时,需要特别留意当时环境的语境是什么,否则会发现获取的结果和别人是不一样的。
修改语系<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD4KPHA+1NpsaW51eNbQv8nS1Mq508Nsb2NhbGWy6b+00+/Ptbu3vrOjrNPvz7XF5NbDzsS8/srHL2V0Yy9kZWZhdWx0L2xvY2FsZaOodWJ1bnR1o6m78tXfL2V0Yy9zeXNjb25maWcvaTE4bqOoY2VudG9zo6k8L3A+CjxwPjwvcD4KCtaxvdO9q0xBTkc9JnF1b3Q7UE9TSVgmcXVvdDsgu/LV30xBTkc9JnF1b3Q7QyZxdW90OyjBvdXfz+DNrCnIu7rz1rG903NvdXJjZSDF5NbDzsS8/go8cD48L3A+CjxwPtPJ09qyu82stcTT78+1ttTV/dTyse2078q9o6zL+dLU0OjSqtK7uPbNs9K7tcSx7cq+t723qMC0se3KvqOsz8LD5tXiuPa3+7rF1Nq499Pvz7XPwsrH0rvWwrXEo7o8L3A+CjxwPjxpbWcgc3JjPQ=="http://www.2cto.com/uploadfile/Collfiles/20150403/2015040310001813.jpg" alt="">
评论暂时关闭