05. Shell正则表达式

  • 正则表达式

    1. 正则表达式是一个字符串,用来表示一个规则,用来描述或匹配符合此规则的结果;
    2. 在文本编辑中,正则表达式通常用来检索/替换符合某个模式的文本内容;
    3. 常用的正则表达式工具grep,sed,awk

  • grep检索

    grep [-option] 文件名
      -c:打印符合要求的行数
      -i:忽略大小写
      -n:带行号输出
      -v:打印不符合要求的行
      -A:例如-A2或-A 2,表示打印符合要求的行以及下面两行
      -B:打印符合要求的行以及上面n行
      -C:打印符合要求的行以及上面和下面的n行
      -l:列出包含某些字符的文件名
    

    参数ABC

    image.png

    输出行号

    image.png

    正则式

    1. [0-9] 即包含0到9数字
    2. [0-9a-zA-Z] 包含数字0到9,字母a到z和A到Z
    3. [^A-Z] 不包含字母A到Z
    4. [678] 包含6或7或8的,而非678
    image.png

    正则式+字符串

    image.png

    开头&结尾

    1. 在字符串中,^表示行的开始;
    2. 在字符串中,$表示行的结尾;
    3. 在字符串中,^$表示空行;
    image.png

    通配符

    1. 符号.代表任意一个字符;
    2. 符号*代表了0或多个*之前的字符;
    3. 符号.*表示任意字符,包括空行;
    image.png

    出现次数

    1. \为转义字符;
    2. '\{n1,n2\}'其中n1<n2,出现次数[n1,n2],若省略n2,则表示>=n1
    image.png

  • sed

    1. grep只能实现查找,无法实现编辑;
    2. vim可实现查找替换,但无法输出到屏幕上;
    3. sed和awk可实现将替换文本输出到屏幕上;
    4. sed和awk都是流式编辑器,是对文档的行来操作的

    打印行

    1. p字符实打印输出
    2. -n实现打印某行
    sed -n 'x'p filename  打印第x行,x为任意数字,''可省略
    sed -n '1,$'p filename 打印多行,'1,x'即第1到第x行,'1,$'表示整个文档
    sed -n '/xxx/'p filename 打印包含xxx内容的行
    
    image.png

    特殊字符

    1. 在字符串中,^表示行的开始;
    2. 在字符串中,$表示行的结尾;
    3. 在字符串中,^$表示空行;
    4. 符号.代表任意一个字符;
    5. 符号*代表了0或多个*之前的字符;
    6. 符号.*表示任意字符,包括空行;
    image.png

    多个行为

    1. -e实现多个行为
    sed -e '/xxx/'p -e '/xxx/'p ... -n filename
    
    image.png

    删除行

    1. d符号实现删除打印;
    2. 此结果只影响打印结果,不影响文件实际内容
    sed 'x'd filename  删除第x行,然后输出结果
    sed 'x,y'd filename 删除从第x行到第y行,然后输出结果
    sed '/xxx/'d filename 删除能匹配到xxx内容的行,然后输出结果
    
    image.png

    替换

    1. s符号实现替换打印;
    2. g符号实现全局替换,否则,只替换匹配到的第一个;
    3. 此结果只影响输出结果,不影响文件实际内容
    sed 'x,ys/xxx/yyy/g' filename  将第x到y行的字符xxx均替换为yyy并输出到屏幕
    sed 's/xxx/yyy/g' filename 将整个文件的字符xxx均替换为yyy并输出到屏幕
    sed 's@xxx@yyy@g' filename 符号/可使用@,#等符号代替,作用一样
    sed 's/[0-9]//g' filename 将所有的数字删除(替换为空)并输出到屏幕
    sed 's[0-9A-Za-z]//g' filename 将所有的数字和字母删除并输出到屏幕
    
    image.png

    位置互换

    1. 通过s符号实现位置互换;
    2. 通过s符号和&符号实现插入操作;
    3. 符号.*$与符号.*均代表整个文档,符号$代表空行;
    4. 此操作只改变输出结果,不改变文本源内容
    sed 's/\(xxx\)\(.*\)\(yyy\)/\3\2\1/' filename 将字符xxx与yyy互换位置,其他保持不变;
        其中\(\)为转义的小括号即(),符号.*表示任意多的任意字符,\3\2\1对应括号表示其位置;
        基础语法:sed 's/互换的内容/位置顺序/' 文件名
    sed 's/^.*$/xxx&/' filename  在文档每行的行首插入字符xxx;
        等同:sed 's/.*/xxx&/' filename
    sed 's/^$/xxx&/' filename 相当于在空行行首插入字符xxx
        等同:sed 's/^$/xxx/' filename 即将空行替换为字符xxx
    sed 's/^.*$/&xxx/' filename 在文档每行的行末插入字符xxx;
    sed 's/^.*$/xxx/' filename 即将文档所有行的内容均替换为xxx;
    sed 's/^\(.\)\(.*\)\(.\)$/\3\2\1/' filename 即将文档每行的首字符与尾字符互换位置
    sed 's/^\(.*\):\(.*\):\(.*\)$/\3:\2:\1/' filename 即以:为分割符,将首块和尾块互换位置
    
    image.png
    image.png

    修改源文件

    1. 参数 -i 实现直接修改文件内容;
    2. 修改时不在屏幕打印修改结果;
    3. 因可直接修改文件,故一般在修改前先备份文件;
    sed -i 's/:/,/g' filename  例:此语句可将文件实际内容修改,替换:为,写入
    
    image.png

  • awk

    1. awk与sed一样为流式编辑器,即针对行进行操作,一行一行执行;
    2. awk比sed更强大,可实现sed的功能,也能做到sed无法做到的

    打印

    1. -F 参数后面跟分割符,以''包括,缺省为tab;
    2. '{print $x,$y...}' 为输出方法,$x为分割出的第x块;
    3. 符号$0代表整行;
    4. 在print方法中,可加入想输出的字符,但需要使用"xxx"将其包括;
    5. 此操作不改变文件源内容
    head -n2 filename | awk -F':' '{print $x}'  命令head截取文件前2行,在此两行中操作:
        以:为分割符,打印被分割出的第x区域的内容,其中:根据实际需要选取分割符
    awk -F':' '{print $x,$y,...}' 打印多个分区
    awk -F':' '{print $0}' 打印整行,等同 awk '{print $0}'
    awk -F':' '{print $x"#"$y"aaa"$...}'  在各分区中插入向输入的字符,且必须使用"xxx"包括 
    
    image.png

    匹配

    1. 符号~表示匹配的意思;
    awk -F':' '$n~/xxx/' filename  通过:分割,第n区中匹配字符xxx,输出全行;
    awk -F':' '$n~/xxx/ {print $m}' filename  通过:分割,第n区中匹配字符xxx,输出m区;
    awk -F':' '/xxx/ {print $m} /yyy/ {print $n}' filename  通过:分割;
        匹配到xxx的结果,打印其第m区,匹配到yyy的结果,打印其第n区,并顺序输出.
    
    image.png

    条件操作

    1. 逻辑比较符号 ==,!=,>,>=,<,<=
    2. 匹配结果均为字符或字符串,无数字,故为ascii码的比较
    3. 逻辑运算符号 &&,||
    image.png
    image.png

    内置变量

    1. NF:用分割符分割后的段数;
    2. NR:行数
    awk '{print NR}' filename  打印文件行数
    awk -F':' '{print NF}' filename  打印分割段数
    
    image.png

    数学运算

    image.png

推荐阅读更多精彩内容