zoukankan      html  css  js  c++  java
  • shell(2):正则表达式

    一、整理正则表达式博客

    (1)正则

    正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。

    在linux中,通配符是由shell解释的,而正则表达式则是由命令解释的,下面我们就为大家介绍三种文本处理工具/命令:grep、sed、awk,它们三者均可以解释正则。

    正则介绍:

    ^行首
    $行尾
    .除了换行符以外的任意单个字符
    .*所有字符
    *:左边的那一个字符有0个到无穷个
    +:左边的那一个字符有1个到无穷个
    ?:左边的那一个字符有0个到1个
    {n}:左边的那一个字符有n个
    {n,m}:左边的那一个字符有n个到m个
    {n,}:左边的那一个字符有n个到无穷个
    

      

    []字符组内的任一字符
    [^]对字符组内的每个字符取反(不匹配字符组内的每个字符)
    ^[^]非字符组内的字符开头的行
    [a-z]:所有的小写字母
    [A-Z]:所有的大写字母
    [a-zA-Z]:所有的大小写字母,等于[a-Z]
    [0-9]:数字
    <单词头 单词一般以空格或特殊字符做分隔,连续的字符串被当做单词
    >单词尾
    注意的一点是:如果要匹配的字符就是-本身话,必须放到最后去[123123-]
    

      

    扩展正则sed 加 -r参数或转义
    grep 加-E或egrep或转义
    awk直接支持,但不包含{n,m}
    可以使用--posix支持
    awk '/ro{1,3}/{print}' /etc/passwd
    awk --posix '/ro{1,3}/{print}' /etc/passwd
    
    sed -n '/roo?/p' /etc/passwd
    sed -rn '/roo?/p' /etc/passwd
    ?前导字符零个或一个
    +前导字符一个或多个
    abc|def abc或def
    a(bc|de)f abcf或adef
    x{m}x出现m次
    x{m,}x出现m次至多次(至少m次)
    x{m,n}x出现m次至n次
    

      

    (2)grep

    参数

    -n  :显示行号
    -o  :只显示匹配的内容
    -q  :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容
    
    -l  :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl 'root' /etc 
    -A  :如果匹配成功,则将匹配行及其后n行一起打印出来
    -B  :如果匹配成功,则将匹配行及其前n行一起打印出来
    -C  :如果匹配成功,则将匹配行及其前后n行一起打印出来
    --color
    -c  :如果匹配成功,则将匹配到的行数打印出来
    -E  :等于egrep,扩展
    -i  :忽略大小写
    
    -v  :取反,不匹配
    -w:匹配单词
    

      

    (3)sed

    sed 选项参数 命令

    例如:
    
    #sed -n '3p' test.txt     #静默输出第3行内容,3为定位行位置,p为命令
    #sed ‘4a abcd’ test.txt     #第4行追加abcd字符,a为命令
    

      



    其中,

    选项参数:

    -n:静默处理,不打印输出结果
    

      

    命令:

    p:打印
    c:替换行内容
    a:追加内容
    i:插入内容
    1,4d:删除1到4行内容
    1d,4d:删除1行和4行内容
    d:删除
    //:命令中使用正则表达式放入//中
    //d:删除正则匹配到的行
    s:替换
    s/aaa/bbb/g:将全部行中的aaa替换为bbb,不加g则每行只替换第一个aaa
    s/()()/12/g:匹配两个括号中的内容,12表示将第一个括号和第二个括号内容显示
    例如:
    
    #sed 's/^(.)(.*)$/2/' test.txt     #test文件中任意行去掉第一个字符,^(.)任意单字符开始,(.*)任意0到无穷字符,2只显示第二个括号部分
    

      


    二、grep(正则表达式及字符处理)
    目标文件/etc/passwd,使用grep命令或egrep

    1.显示出所有含有root的行:

    2.输出任何包含bash的所有行,还要输出紧接着这行的上下各两行的内容:

     

    3. 显示出有多少行含有nologin。

    4.显示出那些行含有root,并将行号一块输出。

    5.新建用户

    abominable
    abominate
    anomie
    atomize
    编写正则表达式,将他们匹配出来

    (.除了换行符以外的任意单个字符)

    删除用户:

    或者使用userdel

    6.建四个用户
    Alex213sb
    Wpq2222b
    yH438PIG
    egon666
    egon

    过滤出用户名组成是字母+数字+字母的行

    7.显示出/etc目录下所有包含root的文件名

    (-o显示)

    8. 过滤掉/etc/ssh/sshd_config内所有注释和所有空行

    作业三:Sed作业:以/etc/passwd文件为模板

    1,删除文件每行的第一个字符。

    sed -r 's/^(.)(.*)/2/' etc/passwd
    

      

    2,删除文件每行的第二个字符。

    sed -r 's/^(.)(.)(.*)/13/' /etc/passwd
    

      

    3,删除文件每行的最后一个字符。

    sed -r 's/(.*)(.)$/1/' /etc/passwd
    

      

    4,删除文件每行的倒数第二个字符。

    sed -r 's/(.*)(.)(.)$/13/' /etc/passwd
    

      

    5,删除文件每行的第二个单词。

    sed -r 's/^([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)/124/' /etc/passwd
    

      

    6,删除文件每行的倒数第二个单词。

    sed -r 's/([a-Z]+)([^a-Z]+)([a-Z]+)$/23/' /etc/passwd
    

      

    7,删除文件每行的最后一个单词。

    sed -r 's/([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)$/123/' /etc/passwd
    

      

    8,交换每行的第一个字符和最后一个字符。

    sed -r 's/^(.)(.*)(.)$/321/' /etc/passwd
    

      

    9,交换每行的第一个字符和第二个单词。

    sed -r 's/^(.)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)/42315/' /etc/passwd
    

      

    10,交换每行的第一个单词和最后一个单词。

    sed -r 's/^([a-Z]+)([^a-Z]+)(.*)([^a-Z]+)([a-Z]+)$/52341/' /etc/passwd
    

      

    11,删除一个文件中所有的数字。

    sed -r 's/[0-9]//g' /etc/passwd
    

      

    12,删除每行开头的所有空格。

    sed -r 's/^ *//g' /etc/passwd
    

      

    13,用制表符替换文件中出现的所有空格。

    sed -r 's/ /	/g' /etc/passwd
    

      

    14,把所有大写字母用括号()括起来。

    sed -r 's/[A-Z]/(&)/g' /etc/passwd
    

      

    15,打印每行3次。

    sed 'p;p' /etc/passwd
    

      

    16,只显示每行的第一个单词。

    sed -r 's/^([a-Z]+)([^a-Z]+)(.*)/1/' /etc/passwd
    

      

    17,打印每行的第一个单词和第三个单词。 

    sed -r 's/^([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)/523416/' /etc/passwd
    

      

    18,用命令获取格式为 mm/yy/dd 的日期格式,结合管道,将其换成 mm;yy;dd格式

     

  • 相关阅读:
    Win10系列:C#应用控件进阶9
    Win10系列:C#应用控件进阶6
    Win10系列:C#应用控件进阶7
    Win10系列:C#应用控件进阶5
    Win10系列:C#应用控件进阶4
    max_element()函数和min_element()函数
    typename的一些用法和注意问题
    std中list作为常量传参时一个迭代器错误
    C++ STL 中list是双向循环链表中循环可以实现什么功能?
    C++中list的erase()函数问题
  • 原文地址:https://www.cnblogs.com/xuyaping/p/6605465.html
Copyright © 2011-2022 走看看