首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

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

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

正则表达式

    ():匹配小括号内的字符串,可以是一个,也可以是多个,常跟“|”(或)符号搭配使用,是多选结构
    []:匹配字符组内的字符,比如咱们常用的[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] 所有字母中的任意一个
    < 单词头 > 单词尾 (以空格分隔单词)

    转义支持

    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 才能匹配到结果

    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 '^$'

    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#'
返回列表