(一)文本处理工具

  • Linux上的文本处理三剑客
  • grep,egrep,fgrep:文本过滤工具(通过模式:pattern)
  • grep支持基本正则表达式,-E选项支持扩展正则表达式,-F不支持正则表达式
  • egrep支持扩展正则表达式,-G选项支持基本正则表达式,-F不支持正则表达式
  • fgrep不支持正则表达式元字符(可以支持普通字符??),因此速度快,f代表fast
  • sed:stream editor/流编辑器;文本编辑工具
  • awk/gawk:Linux上的实现为gawk,awk为指向gawk的链接;文本报告生成工具(格式化文本)
  • 正则表达式/Regular Expression,简写为RegExp
  • 由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或者通配的功能。
  • 主要分为两类:
  • 基本正则表达式:BRE
  • 扩展正则表达式:ERE
  • 区别:元字符不同
  • 正则表达式引擎
  • grep:Global search Regular Expression and Print out the line
  • 作用:文本过滤工具,能够根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查;打印匹配到的行
  • 模式:由正则表达式的元字符及文本字符所编写出的过滤条件
  • 各个工具的正则表达式引擎可能不同
  • 用法:
  • grep [OPTIONS] PATTERN [FILE...]
  • grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...] /将正则表达式写在文件里
  • --color=auto:将匹配到的文本进行着色高亮显示
  • -i:ignore case/不区分大小写;不指定则严格区分
  • -o:只显示匹配到的字符串本身,而不是整行
  • -v:--invert-match:显示不能被模式匹配到的行
  • -E:支持使用扩展的正则表达式
  • -q:--quiet/--silent,静默模式,即不输出任何信息。通过$!查看是否匹配到了
  • -A #:after,显示匹配到的行,及其前面的#行
  • -B #:before,显示匹配到的行,及其后面的#行
  • -C #:context,显示匹配到的行,及其前后的#行
  • 基本正则表达式的元字符
  • 字符匹配类
  • .:匹配任意单个字符
  • []:匹配指定范围内的任意单个字符
  • [^]:匹配指定范围外的任意单个字符
  • 范围表示:gG,a-z,[:digit:],[:lower:],[:upper:],[:alpha:],[:alnum:],[:punct:],[:space:],外面加上[]或者[^]
  • 匹配次数类
  • 放在要指定出现次数的字符的后面/用于限制其前面出现字符的次数
  • 正则表达式是贪婪模式,能匹配多长就匹配多长,比如xxxxxy用x*y匹配,结果是xxxxxy,而不是xy
  • *:匹配前面字符任意次;0,1,多次。“.*”表示任意长度的任意字符
  • \?:匹配前面的字符0次,或1次,即可有可无
  • \+:匹配前面的字符1次,或多次,即必须有
  • \{m\}:匹配前面的字符m次
  • \{m,n\}:匹配前面的字符至少m次,至多n次
  • \{0,n\}:至多n次
  • \{m,\}:至少m次
  • 位置锚定类
  • ^:行首锚定,写在整个模式的最左侧
  • $:行尾锚定,写在整个模式的最右侧
  • ^Pattern$:匹配整行
  • ^$:空白行,空白字符也没有
  • ^[[:space:]]$:空白行,可以包含若干空白字符
  • 术语“单词”:非特殊字符组成的连续字符(字符串)都称为单词
  • \<或者\b:词首锚定,写在单词模式的左侧
  • \>或者\b:词尾锚定,写在单词模式的右侧
  • \<Pattern\>:锚定整个完整单词
  • 分组及引用
  • \(\):将一个或多个字符捆绑到一起,当作一个整体单元进行处理 后项引用:只能用在正则表示式中,不能用在bash中
  • 分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于其内部的变量中,这些变量为:
  • \1:从左侧起,第一对括号内部的模式所匹配到的字符
  • \2:从左侧起,第二对括号内部的模式所匹配到的字符
  • \3:从左侧起,第三对括号内部的模式所匹配到的字符
  • ...
  • 注:括号可以嵌套,以左括号为准
  • 例如:grep "\(l..e)\.*\1" lovers.txt只能匹配到he loves his lover,不能匹配到he likes his lover
  • 因此\(\)既可以出现在分组的情况下,也可以出现在引用的情况下

练习:

1,显示/etc/passwd文件中不以/bin/bash结尾的行

答案:grep -v "/bin/bash$" /etc/passwd

2,显示/etc/passwd中的两到三位的数字

答案:grep "\<[0-9]\{2,3\}\>" /etc/passwd