chaosxin 发表于 2018-8-30 07:07:43

Shell下的正则表达式及实例

  一、正则表达式简述
  ·概念:用一串字符,描述有共同属性的数据
  ·注意:使用正则表达式匹配时,一定要注意 \ 转移符号的使用
  ·格式:
  a、    grep [选项]‘正则表达式’文件列表1 文件列表2
  b、    | 管道命令
  ·处理方式
  a、以行为处理单位
  b、默认输出与正则表达式匹配的行刀屏幕上
  c、对数据进行逐行处理,处理完当前行,自动处理下一行,直到结束
  ·选项
  → --color    高亮显示匹配的数据
  → -q         不显示匹配的结果
  → -c         统计符合匹配的行的行数
  → -v         取反匹配
  → -n         显示符合匹配的行的行号
  → -i         匹配时忽略字母大小写
  → -E         扩展匹配,或使用egrep
  → [ ]      范围内匹配,匹配范围内的任意一个字符,可以使用连字符“-”
  二、匹配实例
  ·匹配字母:
  →    #匹配 d 或 o 或 t 或 a
  →       #匹配 a 到 z 中的任意一个字符即可,同理
  →       #匹配所有字母
  ·匹配数字
  →       #匹配 1 或 3 或 9
  →       #匹配所有数字
  →    #匹配所有数字和字母
  ·匹配符号
  → [?!_-]   #不要把符号“-”写在其他字符之间,否则会将其当做连字符,而不进行匹配
  → \<         #匹配单词开头
  → \>         #匹配单词结尾
  # cat text      #自己编一个文本,这里简单举几个例子,用 | 管道或直接用grep都可以
  dota
  abcd
  ABCD
  1234
  abcd1234
  a1b2c3d4
  1A2B3C4D
  thank you for watching
  # cat text | grep dota
  dota
  # cat text | grep
  dota
  abcd
  abcd1234
  a1b2c3d4
  thank you for watching
  # grep text
  dota
  abcd
  ABCD
  abcd1234
  a1b2c3d4
  1A2B3C4D
  thank you for watching
  # grep "\"
  thank you for watching
  # cat text | grep [-]
  ?!_-
  # cat text | grep -E 'dota|1234'
  dota
  1234
  abcd1234
  # grep -E 'dota|^1234$' text
  dota
  1234
  ·匹配范围
  → ^   #匹配数字开头的行
  → [^0-9]   #取反匹配行,^在[]中表示‘反向选择’
  # cat text | grep ^
  1234
  1A2B3C4D
  #这里仍然会匹配到含有数字的行,是因为匹配到的行都含有非数字的字元,所以仍会匹配到
  # cat text | grep [^0-9]
  dota
  abcd
  ABCD
  abcd1234
  a1b2c3d4
  1A2B3C4D
  thank you for watching
  ?!_-
  #这里与[^0-9]匹配同理
  # grep [^a-z] text
  ABCD
  1234
  abcd1234
  a1b2c3d4
  1A2B3C4D
  thank you for watching
  ?!_-
  # cat text | grep [^A-Z]
  dota
  abcd
  1234
  abcd1234
  a1b2c3d4
  1A2B3C4D
  thank you for watching
  ?!_-
  # cat text | grep [^a-Z]
  1234
  abcd1234
  a1b2c3d4
  1A2B3C4D
  thank you for watching
  ?!_-
  三、元字符
  ·元字符(正则符号):正则表达式由一个或多个元字符组成
  ·元字符分类:字符匹配、次数匹配、位置锚定、分组等
  → ^     #行首匹配
  → $   #行尾匹配
  → ^$    #空行匹配
  → .   #匹配任意单个字符(换行符 \n 除外)
  .$      #匹配以任意字符结尾的行
  ^.$       #匹配由任意一个字符结尾的行
  ^x.y$   #匹配含有x.y的行,这里 . 代表任意字符
  \.$       #匹配以字符 . 结尾的行
  # cat text | grep '^do'
  dota
  # grep '34$' text
  1234
  abcd1234
  # cat text | grep 'w.t'
  thank you for watching
  ·设置正则表达式的匹配次数、格式
  → *   #匹配前面正则表达式,出现零次或多次
  → ?   #匹配前面正则表达式,出现零次或一次
  → +   #匹配前面正则表达式,出现一次或多次
  → ()    #把表达式作为整体来匹配
  → {n,m} #指点前面正则表达式,匹配次数的范围
  {n,} #匹配次数大于等于 n 次
  {,m} #匹配次数小于等于 m 次
  {x}#匹配次数等于 x 次
  # cat repetition
  abc
  abcabc
  abcabcabc
  # grep "\(abc\)\{1\}" repetition
  abc
  abcabc
  abcabcabc
  # grep "\(abc\)\{3\}" repetition
  abcabcabc
  # grep "\(abc\)\{2,3\}" repetition
  abcabc
  abcabcabc
  # grep "\(abc\)\{2,\}" repetition
  abcabc
  abcabcabc
  几个实用的例子
  ·匹配邮箱地址
  # grep "\{1,15\}@\{1,20\}\(\.com\)\|\(\.cn\)"1.txt
  abc@163.com
  ·匹配IP地址
  # grep "\(\{1,3\}\.\)\{3\}\{1,3\}" /etc/sysconfig/network-scripts/ifcfg-eth0
  IPADDR=172.16.8.8
  NETMASK=255.255.255.0
  GATEWAY=172.16.8.1
  DNS1=192.168.8.1
  ·匹配MAC地址
  # grep "\(\{2\}:\)\{5\}\{2\}" /etc/sysconfig/network-scripts/ifcfg-eth0
  HWADDR=00:0c:29:40:74:d7
  如有出错,请帮忙指出

页: [1]
查看完整版本: Shell下的正则表达式及实例