grep工具及正则表达式

时间:2021-12-17 00:44:37

正则表达式和通配符

正则表达式与通配符不一样,它们表示的含义并不相同!正则表达式只是一种表示法,只要工具支持这种表示法,那么该工具就可以处理正则表达式的字符串。vim、grep、awk、sed都支持正则表达式,也正是因为它们支持正则,才显得它们强大。

很多编程语言都有正则。
python的re相关正则介绍:http://www.cnblogs.com/liao-lin/p/7091866.html

grep工具

grep通用正则表达式分析程序(global research regular expression and printing)
用途:使用正则表达式搜索文本,并把匹配的行打印出来
grep用法:
grep [options] 'pattern' filename
常用选项:

  • -a 以文本文件方式搜索
  • -n 打印匹配到的行的行号
  • -i 忽略大小写匹配
  • -c 如果匹配成功,则将匹配到的行数打印出来
  • -o 只显示匹配内容
  • -q 静默模式,过滤成功与否都没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容
  • -l 如果匹配成功,则只将文件名打印出来,失败则不打印,通常与-rl一起用,grep -rl 'root' /etc/
  • -An 如果匹配成功,则将匹配行及其后n行一起打印出来,after
  • -Bn 如果匹配成功,则将匹配行及其前n行一起打印出来,before
  • -Cn 如果匹配成功,则将匹配行及其前后n行一起打印出来,context
  • -f 根据文件内容进行匹配,从文件每一行获取匹配模式
  • -v 取反,反向选择,不匹配
  • -w 匹配单词(单词用分隔符来界定)
  • -E 扩展正则,等同于egrep

基础正则介绍

^       行首
$        行尾
.         除了换行符以外的任意单个字符
?         前导字符出现零个或一个
*         前导字符出现零个或多个
+         前导字符出现一个或多个
.*         所有字符
[]         字符组内的任一字符
[^]       对字符组内的字符匹配取反(反向匹配)
^[^]     匹配不是[]内字符开头的内容
[a-z]      小写字母
[A-Z]     大写字母
[a-Z]     小写和大写字母
[0-9]      数字
\<          单词头,单词一般以空格或者特殊符做分隔,连续的字符串被当做单词
\>          单词尾
abc|def    abc或def
a(bc|de)f  abcf或adef
x{m}        x出现m次
x{m,n}      x出现m次到n次
x{m,}        x出现m次到无限次

示例:

输出b文件中在a文件相同的行
# grep -f a b  
输出b文件中在a文件不同的行
# grep -v -f a b
去除空格sshd_config文件空行或#开头的注释行
# egrep -v "^$|^#" /etc/ssh/sshd_config
输出匹配的前五个结果
# seq 20|egrep -m 5 '[0-9]{2}'  
10  
11  
12  
13  
14  
统计匹配多少行
# seq 20|egrep -c '[0-9]{2}'  
11
匹配/etc/passwd文件以root开头的行
# grep ^root /etc/passwd  
root:x:0:0:root:/root:/bin/bash
递归搜索/etc目录下包含192.168.内容的conf后缀文件
# grep -rl "192.168." /etc/ |grep "\.conf$"
/etc/resolv.conf  
/etc/dnsmasq.conf  
/etc/rsyslog.conf  
/etc/security/access.conf  
匹配所有IP
# egrep -r -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" /etc  
打印匹配结果及后三行
# seq 10 |grep 5 -A 3  
5  
6  
7  
8