• linux正则表达式的用法


    概述

    本文demo的测试环境为CentOS 8、Ubuntu。

    参考书籍:《鸟哥的Linux私房菜——基础篇(第四版)》,喜欢原汁原味的小伙伴可以看原作。本文是对其正则表达式章节的总结,并添加了个人的一些理解。如果错误,欢迎批评指正!

    grep命令

    grep是一个很常用的命令,它支持正则表达式,可以按照特定需求,将字符串按照一定格式打印出来。比如之前经常用的

    ps -ef | grep java

    查找包含“java”的所有进程。

    所有测试所用到的数据都在书中作者提供的一个文件里,有需要的小伙伴可以直接下载。

    wget http://linux.vbird.org/linux_basic/0330regularex/regular_express.txt

    grep的简单使用

    #搜索带有java的行数 -n表示带行号
    grep -n 'java' regular_express.txt
    
    #搜索不带java的行数
    grep -vn 'java'  regular_express.txt
    
    #忽略大小
    grep -in 'java' regular_express.txt

    基础正则表达式

    [ ]

    中括号:表示取其中任意一个字符。例如[abc],表示取a、b、c中的一个。

    #搜寻文件中的test或者tast,-n表示带行号
    grep -n 't[ae]st' regular_express.txt

    ^

    ^ 在不同的情况下,表示的含义不一样。

    • 在中括号里表示取反:
    #包含oo
    grep -n 'oo' regular_express.txt
    
    #非g开头
    grep -g '[^g]oo' regular_express.txt
    • 在中括号外表示首行的意思
     #The开头
     grep -n '^The' regular_express.txt

    在第二种语义下,与之相对的是 $ 美元符号

    #表示以点结尾的行
    grep -n '.$' regular_express.txt
    
    #一首一尾,没有空格,表示空白行
    grep -n '^$' regular_express.txt

    -

    短杠表示范围

    • 表示小写字母。大写字母同理
    #小写字母开头,后面跟oo
    grep -n '[a-z]oo' regular_express.txt
    • 多个范围,例如字母数字
    #字母数字,后面跟oo
    grep -n '[A-Za-z0-9]oo' regular_express.txt

    . 和 * 

    虽然都是占位符,但是点(.)表示一定占一个位置,而星号(*)表示占一个或者多个位置。

    注意,正则里面的 星号(*)和万用字符的星号不一样,它表示是对它前面一个字符的拓展。

    在命令行里,*表示任意名称

    #表示列举test目录下以sh结尾的文件
    ls
    -l /root/test/*sh

    而在正则里面,*需要和前面一个字符联系在一起看,比如” a* “则表示,零个或者多个a

    ‘ooo*’要拆下来理解,分为两部分
    'oo''o*'前者表示已经确定的两个o,后者表示零个或者无数个o,结合起来看就是,两个或者两个以上连续的o
    #表示含有good
    grep -n 'g..d' regular_express.txt
    
    #表示至少两个o
    grep -n 'ooo*' regular_express.txt
    
    #如果想表示任意字符,比如两个g之间可以有任何字符,可以通过组合'.*'来实现,表示可能有零个或者有多个点,而点表示任意一个数,所以结合起来
    grep -n 'g.*g' regular_express.txt
    
    #任意数字
    grep -n '[0-9][0-9]*' regular_express.txt
    
    #只包含数字
    grep -n '^[0-9][0-9]*$' regular_express.txt

    {}

    大括号限定连续的范围,需要和 * 联系起来

    #表示两个或者两个以上的o
    grep -n 'ooo*' regular_express.txt
    
    #和上面一个没啥区别,表示两个或两个以上的o
    grep -n 'o{2}' regular_express.txt
    
    #两个到五个
    grep -n 'o{2, 5}' regular_express.txt

    sed和awk

    sed和awk也是对数据进行处理的工具,不过侧重点不同,sed侧重要对一行一行的数据进行处理,awk侧重于把每一行分成数个字段,进行处理,相对来说,更加精细一点。

    这边先列举sed的几个测试demo,日后会对这两个命令进行更深入的学习。

    关于sed的详细说明,可以参考:

    https://blog.csdn.net/wdz306ling/article/details/80087889

    删除与新增

    删除(d,delete)

    #删除第二行
    #nl表示将目标内容加上行号后,写到标准输出
    nl /etc/passwd | sed '2d'
    
    #删除二到五行
    nl /etc/passwd | sed '2,5d'
    
    #删除第二行到末尾
    nl /etc/passwd | sed '2,$d'

    新增(a, add)

    目标行的后面一行

    #在第2行和第3行之间加上drink milk
    nl /etc/passwd | sed '2a drink milk'
    
    #加上多行
    nl /etc/passwd | sed '2a drink milk / tea / coco'

    新增(i)

    目标行的前面一行

    #在第2行和第1行之间加上 drink milk
    nl /etc/passwd | sed '2i drink milk'

    以行为单位的取代与显示功能

    替换

    #将指定行数替换为自定义内容
    #将第2到5行替换为MySelf Define
    nl /etc/passwd | sed '2, 5c MySelf Define'

    显示

    #第五到七行
     nl /etc/passwd | sed -n '5, 7p

    永久修改

    -i 参数可以改变源文件的内容,慎用

     #每一行结尾若是.则改成!
     sed -i 's/.$/!/g' regular_express.txt
     #最后一行加上一句话:This is a test。
     #$表示最后一行,a表示新增
     sed -i '$a # This is a test' regular_express.txt 
  • 相关阅读:
    Intel汇编语言程序设计学习-第三章 汇编语言基础-中
    Intel汇编语言程序设计学习-第三章 汇编语言基础-上
    对支付链接的加密处理 面向接口编程
    编制预算的四个好方法
    Twitter欲以10亿美元收购Flipboard 双方未置评
    分手决策——合伙人离婚时怎样保护你的公司
    领导力须突破命令控制式管理
    腾讯首席探索官建言创业者:尽可能留住早期员工
    人力资本管理的坏习惯
    我们在培训领导者这件事上行动迟缓
  • 原文地址:https://www.cnblogs.com/phdeblog/p/13916193.html
Copyright © 2020-2023  润新知