正则表达式及相关工具-Linux

  1. 正则表达式
  • ():匹配小括号内的字符串,可以是一个,也可以是多个,常跟“|”(或)符号搭配使用,是多选结构
  • []:匹配字符组内的字符,比如咱们常用的[0-9a-zA-Z.*?!]等,在[]内的字符都是字符
  • {}:匹配次数,匹配在它之前表达式匹配出来的元素出现的次数
  • ^ 行首 $ 行尾 ^$空行
  • . 任意字符(除换行)
  • * 0-n个 + 1-n个 ? 1个
  • [^]表示除了[]内的内容 ^[]表示要以[]内容开头
  • [0-9] 0-9任意一个字符 [a-z] a-z任意一个字符 [A-Z] A-Z任意一个字符 [a-Z]等价于[a-zA-Z] 所有字母中的任意一个
  • < 单词头 > 单词尾 (以空格分隔单词)
  1. 转义支持
  • grep,sed,awk均是针对文本的行来操作
  • awk 直接支持转义,但不支持{}转义,加 --posix后支持{}转义
  • sed 加-r支持转义
  • grep 加-E支持转义
  • 练习
    grep -i -E 'ro{1,2}' passwd 等价于 grep -i 'ro{1,2}' passwd
    sed -n -r '/roo?/'p passwd 等价于 sed -n '/root?/'p passwd
    awk '/ro{2,}/{print}' passwd 无结果 awk --posix '/ro{2,}/{print}' passwd 才能匹配到结果
  1. grep
  • 参数
    -n :显示行号
    -o :只显示匹配的内容
    -q :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容
    -l :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl 'root' /etc
    -A :如果匹配成功,则将匹配行及其后n行一起打印出来
    -B :如果匹配成功,则将匹配行及其前n行一起打印出来
    -C :如果匹配成功,则将匹配行及其前后n行一起打印出来
    --color :关键字加上颜色显示
    -c :如果匹配成功,则将匹配到的行数打印出来
    -E :等于egrep,扩展
    -i :忽略大小写
    -v :取反,不匹配
    -w:匹配单词
  • 练习
    显示出所有含有root的行:grep 'root' passwd
    输出任何包含bash的所有行,还要输出紧接着这行的上下各两行的内容:grep -C 2 'bash' passwd
    显示出有多少行含有nologin:grep -c 'nologin' passwd
    显示出哪些行含有root,并将行号一块输出:grep -n 'root' passwd
    查找nfsnobody和ntp用户:grep -E 'n(fsnobody|tp)' passwd
    过滤出单词组成是字母+数字+字母的行:grep -E '^[a-Z]+[0-9]+[a-Z]+' passwd
    过滤掉所有注释和空行:sudo grep -v '^#' /etc/ssh/sshd_config | grep -v '^$'
  1. sed
  • 常用参数
    -n p 只打印结果
    -e 实现多行sed指令
    d 删除某行或多行或匹配的某个字符串
    s 替换,替换为空则为删除操作
    g 全局 不加g只处理每行的第一个
    / 可用于分隔符,如果要替换路径等,可将/改为#或@
    -i 可用来直接修改文件内容
  • 练习
    用sed打印所有行:sed -n '1,$'p test.txt
    打印test.txt的3到10行:sed -n '3,10p' test.txt
    打印test.txt 中包含 ‘root’ 的行:sed -n 'root'p test.txt
    删除test.txt 的15行以及以后所有行:sed '15,$'d test.txt
    删除test.txt中包含 ‘root’ 的行:sed '/root/'d test.txt
    替换test.txt 中 ‘root’ 为 ‘toor’:sed 's/root/toor/g' test.txt
    替换test.txt中 ‘sbin/nologin’ 为 ‘bin/login’:sed 's#sbin/nologin#bin/login#g' test.txt
    删除test.txt中5到10行中所有的数字:sed '5,10s/[0-9]//g' test.txt
    删除test.txt 中所有特殊字符(除了数字以及大小写字母):sed 's/[^0-9a-Z]//g' test.txt
    在test.txt 20行到末行最前面加 ‘aaa:’:sed '20,$s/^./aaa:&' test.txt
    把test.txt 中第一个数字移动到行末尾root:x:0:0:root:/root:/bin/bash:sed -r 's#([0-9][0-9]
    )([0-9][0-9])([^0-9].$)#\1\3\2#'

你可能感兴趣的:(正则表达式及相关工具-Linux)