xiuxuan 发表于 2018-8-27 13:01:06

shell编程之grep和正则表达式

  文本处理工具:
  linux上文本处理三剑客:
  grep:文本过滤工具(模式:pattern);
  grep:基本正则表达式,-E,-F
  egrep:扩展正则表达式,-G,-F
  fgrep:不支持正则表达式,-E,-G
  sed:steam editor,流编辑器;文本编辑工具;
  awk:linux上的实现为gawk,文本报告生成器(格式化文本);
  正则表达式:Regular Expression,REGEXP
  由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能;
  分两类:
  基本正则表达式:BRE
  扩展正则表达式:ERE
  正则表达式引擎:
  采用不同算法,检查处理正则表达式的软件模块
  PCRE(Perl Compatible Regular Expressions)
  元字符:\(hello[[:space:]]\+\)\+
  元字符分类:字符匹配、匹配次数、位置锚定、分组
  grep:Global search REgular expression and Print out the line.
  作用:文本搜索工具,根据用户指定的"模式(过滤条件)"对目标文本逐行进行匹配检查;打印匹配到的行;
  模式:由正则表达式的元字符及文本字符所编写出的过滤条件;
  用法:grep "UUID" /etc/fstab
  grep PATTERN
  grep [-e PATTERN | -f FILE]
  grep root /etc/passwd
  grep "$USER" /etc/passwd
  grep `whoami` /etc/passwd
  选项:
  --color=auto:显示颜色;
  -i, --ignore-case:忽略字符大小写;
  -o, --only-matching:只显示匹配到的部分;
  -n, --line-number:显示行号;
  -v, --invert-match:反向显示,显示未匹配到的行;
  -E, --extended-regexp:支持使用扩展的正则表达式;
  -q, --quiet, --silent:静默模式,即不输出任何信息;
  -w, --word-regexp:整行匹配整个单词;
  -c, --count:统计匹配到的行数; print a count of matching lines;
  -A#:after,后#行
  -B#:before,前#行
  -C#:context,前后各#行
  基本正则表达式元字符:
  字符匹配:
  .:匹配任意单个字符;
  []:匹配指定范围内的任意单个字符;
  [^]:匹配指定范围外的任意单个字符;
  匹配次数:用在要指定其出现的次数的字符后面,用于限制其前面字符出现的次数;
  *:匹配其前面的字符任意次;0,1,多次;
  例如:grep "x*y"
  abxy
  aby
  xxxxy
  yab
  .*:匹配任意长度的任意字符;
  \?:匹配其前面的字符0次或1次;
  \+:匹配其前面的字符1次或多次;即其前面的字符要出现至少1次;
  \{m\}:匹配其前面字符m次;
  \{m,n\}:匹配其前面的字符至少m次,至多n次;
  \{0,n\}:至多n次
  \{m,\}:至少m次
  位置锚定:
  ^:行首锚定;用于模式的最左侧;匹配开头的字符;
  grep '^root' /etc/passwd 匹配以root开头的字符
  $:行尾锚定;用于模式的最右侧;匹配结尾的字符;
  grep 'r.*h$' /etc/passwd 匹配以r开头以h结尾的字符
  ^$:空白行
  ^[[:space:]]*$:空行或包含空白字符的行;
  单词:非特殊字符组成的连续字符(字符串)都称为单词;
  \ 用于匹配以hello结尾的单词
  \:匹配完整单词;
  \ 可精确匹配单词hello,而不是helloworld
  分组及引用
  \(\):将一个或多个字符捆绑在一起,当作一个整体进行处理;括号不能交叉,但可以嵌套;
  \(xy\)*ab
  注意:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部变量中,这些变量为:
  \1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
  \2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
  \3:
  ...
  vim lovers.txt
  he loves his lover.
  he likes his lover.
  she likes her liker.
  she loves her liker.
  grep "\(l..e\).*\1" lovers.txt
  grep "^\(r..t\).*\1" /etc/passwd
  后向引用:\1表示后向引用,引用前面第一个括号所匹配到的内容;
  \d:匹配一个数字;等价于;
  \w:匹配字母、数字和下划线;
  \w:匹配非字母、数字和下划线;
  \n:换行符;
  \r:回车;
  \t:制表符;tab
  \f:换页符;
  \s:空白字符;
  \S:非空白字符;
  egrep:
  支持扩展的正则表达式实现类似于grep文本过滤功能; grep -E
  egrep PATTERN
  选项:与grep相同
  特别选项:
  -G:支持基本正则表达式
  扩展正则表达式的元字符:
  字符匹配:
  .:任意单个字符
  []:指定范围内的任意单个字符
  [^]: 指定范围外的任意单个字符
  次数匹配:
  *:任意次,0,1或多次;
  ?:0次或1次,其前的字符是可有可无的;
  +:其前的字符至少1次;
  {m}:其前的字符m次;
  {m,n}:至少m次,至多n次;
  {0,n}
  {m,}
  位置锚定
  ^:行首锚定;
  $:行尾锚定;
  \,\b:词尾锚定;
  grep "\" f1 过滤abc结尾的单词的行
  grep ‘c.\{2\}t’ f1 c后面任意两个字符加t
  分组及引用
  ():分组;括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中;
  后向引用:\1,\2,...
  或:
  a|b:a或者b;
  C|cat:C或cat;
  (c|C)at:cat或Cat
  fgrep:不支持正则表达式元字符;
  当无需用到元字符去编写模式时,使用fgrep性能更好;

页: [1]
查看完整版本: shell编程之grep和正则表达式