grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。
 
reaexp:正则表达式(regular expressions)
常见程序支持reaexp:grep,sed,awk,vim,less,nginx,varnish
 
reaexp分两类:
  基本正则表达式:BRE(base regular)
  扩展正则表达式:ERE(extension regular)
   grep -E,egrep
   用法:把正则表达式转义符删除
  正则表达式引擎:
   采用不同的算法,检查处理正则表达式的软件模块


基本用法

grep [OPTIONS] PATTERN [FILE...]

grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]


OPTIONS:

 

  • -m # 匹配#行后停止匹配
  • -v 显示不被匹配的行
  • -i 忽略大小写
  • -o 只显示匹配到的内容
  • -n 显示匹配到的行号
  • -c 统计匹配行的行数
  • -q 静默模式,不输出任何信息
  • -A # 匹配到的后#行(after)
  • -B # 匹配到的前#行(before)
  • -C # 匹配到的前后#行
  • -e 实现多个选项间的逻辑or关系
  • grep -e "cat" -e "dog" file
  • -w 匹配整个单词
  • -E 使用扩展正则表达式
  • -F 使用fgrep,不支持正则表达式
  • -f file 根据模式文件处理

字符匹配:


  • . 匹配任意单个字符
  • [] 匹配指定范围的任意单个字符 例:[123] 仅匹配123中的任一字符
  • [^] 匹配指定范围外的任意(单个)字符
  • [:space:]:所有水平和垂的空白字符(比[:blank:]包含的范围广)
  • [:blank:]:水平空白字符(空格和制表符)
  • [:punct:]:标点符号
  • [:alnum:]:字母和数字
  • [:alpha:]:a-z A-Z
  • [:lower:]:小写字符
  • [:upper:]:大写字符
  • [:digit:]:数字
  • [:cntrl:]:不可打印的控制字符(退格、删除、警铃...)
  • [:graph:]:可打印的空白
  • [:xdigit:]:十六进制数字

次数匹配: 


  • * 匹配任意次(包括0次) 贪婪模式能匹配多少就是多少
  • .* 匹配任意长度任意字符
  • \? 匹配其前面字符0次或1次(0次)
  • \+ 匹配其前面字符至少1次或以上
  • \{m,n\} 匹配其前面字符至少m次,至多n次
  • \{n\} 匹配其前面字符n次
  • \{m,\} 匹配其前面字符至少m次
  • \{,n\} 匹配其前面字符至多n次

位置锚定:


  • ^ 行首锚定
  • $ 行尾锚定
  • ^pattern$ 匹配整行
  •  ^$ 匹配空行
  •   ^[[:space:]] 匹配空白字符行
  • \< 词首锚定
  • \> 词尾锚定
  • \ 匹配整个单词

分组:


  • \(\) 将多个字符组合在一起,组成一个整体
  • \1,\2,\3 后向引用,后向引用是代表分组匹配的最后结果,而不是正则表达式
  • \(stirng1\+(string2\)*\)
  •   \1:string1+\(string2\)*
  •   \2:string2
  • abc\|d 表示abc或者d
  • \(abc\|d\) 表示abc或者abd
  • ^\(a\|b\) 以a或b开头的

grep匹配用法:


非唯一答案,如用法不对或可优化之处,请及时联系或评论

  • 匹配ifconfig命令的所有ip地址
    ifconfig | grep  "\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}"
  • 找出/etc/passwd中的两位或三位数
    grep "\<[[:digit:]]\{2,3\}\>" /etc/passwd
  • 匹配/etc/fstab开头不是#号的行,且不是空行
    grep "^[^#]" /etc/fstab
  • 匹配分区使用率最大的的分区
    df | grep `df | grep "/dev/sd" | grep -o "[[:digit:]]\{1,3\}%" | sort -nr | head -1 ` | cut -d " " -f1 
  • 显⽰两个⽤户root、user的UID和默认shell
    grep "root\|user" /etc/passwd | cut -d ":" -f3,7
  • 匹配目录基名
    echo "/etc/rc.d/init.d/functions" | grep -o "[^/]\+$"
  • 匹配目录名
    echo "/etc/rc.d/init.d/" | grep -o "/.*[^/]" | grep -o "/.*/" | grep -o "/.*[^/]"
    echo "/etc/rc.d/init.d/" | grep -o "[^/]\+" | tail -1