第十一章 正则表达式(bash对文本的处理)

 


1. Bash中常用正则表达式

复制代码
    ^行首标识符 ^str => 以str开头的行
    $行尾标识符 str$ => 以str结尾的行
    ^$ => 空白行
    \ 转义字符
    数量标识符
        * => 个数>=0
        + => 个数>=1
        ? => 个数 in [0,1]
        \{x,y\} => 个数 [x,y]
    逻辑标识符
        |或
    字符串表示符
        () 
复制代码

2. grep-bash中的like

复制代码
    作用: 根据指定规则扫描文件,并打印符合规则的行       
    格式: grep -参数  'str' [stdin|file](多个文件空格分隔) 
    参数: -v 反向匹配 打印没有匹配到指定字符串的行
         -n 输出的同时打印行号
         -i 忽略大小写
         -c 只打印包含指定内容行的行数
         -r 指定查找的是目录,会将该目录下所有的文件都作为查询对象
         -E 相当于egrep 可以使用 逻辑标识符、数量标识符
    示例:
    1.查询指定目录下中文件包含某个字符串的文件
    [root@gaocun user]# grep  -r '[123]' ./
    ./demo:1
    ./demo:2
    
    2.定位空白行
    [root@gaocun user]# grep -n '^$' demo
    11:
    12:
复制代码

3. egrep(延伸正则表达式)、grep -E、grep的区别

复制代码
    区别:
        egrepgrep -E使用 逻辑标识符、数量标识符时,不用转义
        grep 使用 逻辑标识符、数量标识符时,需要转义
    作用: 同 grep -E
    示例:
    1.匹配 包含aaa的行
    echo "aaa#bbb#ccc" | grep -E  'a{2}'
    echo "aaa#bbb#ccc" | egrep  'a{2}'
    echo "aaa#bbb#ccc" | grep  'a\{2\}' #不用-E参数时,需要对标识符转义
复制代码

4.sed (Bash对文本的增删改查)

4.1 参数说明

复制代码
    作用: 根据指定规则修改文本内容(替换、删除)
    目标源参数:
        -e(默认值) 将指定的文件复制到内存,并不会对原文件进行修改,可以处理 stdin和file
        -i 直接修改文件内容而不是打印,只能处理file
        -n 只打印被处理的行的内容 常用动作参数 -p 打印 一起使用
        -r 在脚本中使用扩展正则表达式    
    动作参数:
        行号a var: 行后插入
        行号i var: 行前插入
        行号x,yc var: x到y行内容 被var替换
        行号x,yd var: x到y行内容 被删除
        行号x,yp var: x到y行内容 被打印
        /var/p var: 包含var的行被打印
        s/old/new/ : 替换第一次出现的old
        s/old/new/g : 替换全局出现的old
    标识符:
        $行尾表示标识符
复制代码

4.2 sed -e '动作参数' [stdin|file]

复制代码
    方式1: 根据 行号处理文本
        #删除
        ’x,yd‘ --删除指定行,并打印处理后的文件内容
        sed '1,2d' demo  #删除 1到2行 内容
        sed '3,$d' demo  #删除 3到最后行 内容
        
        #行后插入
        '[RowNumber]a  NewRowString'  --在指定行后追加新行,并打印处理后的文件内容
        sed  '1a newRow' demo #在1行后添加 newRow
        sed  '1a newRow1\newRow1' demo #在1行后添加 2行内容
         
         #行前插入
        ’[RowNumber]i NewRowString‘ --在指定行前插入新行,并打印处理后的文件内容
        sed  '1i newRow' demo #在1行前添加 newRow
        
        #替换
        'x,yc NewRowString' --指定行数内容替换新内容,并打印处理后的文件内容
        sed '1,3c newRow' demo #将1,3行内容替换为newRow
    
    方式2: 根据 文本内容处理文本
        's/旧内容/新内容/g'--将匹配到的旧内容替换为新内容,并打印处理后的文件内容
        sed 's/[0-9]\+/@/g' demo  #将多个数字字符替换成@(仅替换首次)
        sed 's/[0-9]\+/@/' demo  #将多个数字字符替换成@(全局替换)
复制代码

4.3 sed -i '动作参数' [file] (慎用,会直接修改文件)

复制代码
    方式1: 根据 文本行号处理文本
        ’x,yd‘ --删除指定行,修改目标文件
        sed -i '1,2d' demo  #删除1,2行内容
        
        '[RowNumber]a  NewRowString'  --在指定行后追加新行,修改目标文件
        sed -i '1a newRow' demo #在1行后添加 newRow
         
        ’[RowNumber]i NewRowString‘ --在指定行前插入新行,修改目标文件
        sed -i '1i newRow' demo #在1行前添加 newRow
        
        'x,yc NewRowString' --指定行数内容替换新内容,修改目标文件
        sed -i '1,3c newRow' demo #将1,3行内容替换为newRow
    
    方式2: 根据 文本内容处理文本
        's/旧内容/新内容/g'--将匹配到的旧内容替换为新内容,修改目标文件
        sed -i 's/[0-9]\+/@/g' demo  #将多个数字字符替换成@ 
复制代码

4.4  sed -n '动作参数'

        'x,yp' --显示 x到y行内容
        sed -n '1,3p' demo #打印 1到3行内容
        '/var/p' --显示 包含var的行
        sed -n '/@/p' demo #打印 包含@的行

4.5 最佳实践-匹配到 ip addr命令中的ip

    1.匹配到 ip addr命令中的ip
    [root@gaocun user]# ip addr | grep  'inet.*brd' | sed  's/\/.*//g' | sed 's/.* //g'
    10.0.24.10

4.6 最佳实践-多点编辑

复制代码
    [root@gaocun user]# sed -e '1,3s/[0-9]/@/g' -e '6,$s/[0-9]/#/g'   demo
    @
    @
    @
    4
    5
    #
    #
    #
    #
复制代码

 5. printf(格式化并打印数据)

复制代码
    格式: printf  "指定格式"  data1 data2
    格式替换符 : 
            %s - 字符串
            %c - 字符
            %d - 整数
            %f - 浮点
            %-5s
                - 左对齐(不指定时为右对齐)
                5 任何字符串都内容都会被5个字符宽度显示,字符串不足5字符时会被空格符填充
            %4.2f - 保留2位小数

    示例:
        printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
        printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
        printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
        printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
        -- 结果
        姓名     性别   体重kg
        郭靖     男      66.12
        杨过     男      48.65
        郭芙     女      47.99
复制代码

6. awk

6.1 基础

复制代码
  用途: 按照指定分隔符(默认为空格、\t)对文本进行分割,行分割符为\n,返回一个数组
        并对元素进行操作
  格式:
      awk -参数 '过滤条件 {操作动作 操作变量}' [stdin|file]
  参数:
      -F指定分隔符
      -v设置变量
  操作动作:
      print 打印结尾添加\n
      printf 打印结尾不加\n
  操作变量:
      $1 : 数组的第1个元素
      $2 : 数组的第2个元素
      $3 : 数组的第3个元素
      $0 : 整行数据 
      var : 自定义变量 -vVarName=value
      NF : 每行的元素个数
      NR : 当前行的行号
      FS : 字符分隔符
      FILENAME : 当前文件名
复制代码

6.2 关于操作变量

复制代码
    #数组元素变量
    echo "大王 小王 gao cun" |awk '{print \
    "arr1:"$1 \
    "\narr2:"$2 \
    "\narr2:"$3 \
    "\narr:"$0 \
    }' 
    #执行结果
    arr1:大王
    arr2:小王
    arr2:gao
    arr:大王 小王 gao cun
    
    #自定义变量
    方式1:
    echo "大王 小王 gao cun" |awk -vname=玫瑰 '{print $1,name,$2}'
    大王 玫瑰 小王
    方式2: 
    echo "大王 小王 gao cun" |awk '{name="玫瑰"} {print $1,name,$2}'
    大王 玫瑰 小王
    
    #系统内置变量
    echo "大王 小王 gao cun" |awk '{print \
        "每行的元素个数:" NF \
        "\n当前行的行号:" NR \
        "\n字符分隔符:" FS \
        "\n当前文件名:" FILENAME \
        }' 
复制代码

6.3 每行按指定字符分割,并打印分割后的元素

复制代码
    #默认分隔符 空格或\t
    echo "大王 小王 gao cun" |awk '{print $1,$2,$3,$4}' 
    大王 小王 gao cun
    #指定单个分隔符
    echo "大王#小王#gao@cun" |awk -F# '{print $1,$2,$3,$4}' 
    大王 小王 gao@cun 
    #指定多个分隔符
    echo "大王#小王#gao@cun" |awk -F[#@] '{print $1,$2,$3,$4}' 
    大王 小王 gao cun
复制代码

6.4 运算符的使用

    #过滤第一列的值>2的行
    awk '$1>2' demo
    #过滤第一列的值=2的行
    awk '$1==2 {printf $0}' demo
    #过滤第一列的值=2或第二列的值=g的行
    awk '$1==2 || $2==g {printf $0}' demo

6.5 正则表达式的使用

    #过滤第一列包含数字的行
    awk '$1 ~ /[0-9]/' demo
    ~ 表示 模式开始(默认值)
    // 表示 模式内容
    #模式取反
    awk '$1 !~ /[0-9]/' demo
    awk '!/[0-9]/' demo

6.6 关于awk脚本(没用过,用的时候在补充)

    #关键词
    BEGIN{ 这里面放的是执行前的语句 }
    END {这里面放的是处理完所有的行后要执行的语句 }
    {这里面放的是处理每一行时要执行的语句}

6.7 关于set、awk、grep 更适用哪些场景

    grep 更适合单纯的查找或匹配文本
    sed 更适合编辑匹配到的文本
    awk 更适合格式化文本,对文本进行较复杂格式处理

 7.diff、cmp、patch(对比文件的差异)

7.1  diff

复制代码
#diff
功能: 逐行比较文本文件的差异
参数:
    -y side-by-sid 并排模式
    -W 指定宽度
    -b 忽略一行当中空白的差异
    -B 忽略空白行的差异
    -i 忽略大小写的差异

示例1: 比较两个文件(只打印差异内容)
[root@gaocun user]# diff demo demo1
0a1
> 1   a
2d2
< 3 c

示例2: 并排格式输出(打印所有内容)
[root@gaocun user]# diff demo demo1 -y -W 30
hahaha        | 1   a
2  b    2  b
3 c        <
4 d     4 d 
5 e     5 e
6  f    6  f
7 h     7 h
8 g     8 g 
9 i     9 i
| 表示 同行号内容由差异
< 表示 文件2比文件1少一行
> 表示 文件2比文件1多一行
复制代码

7.2  cmp

#cmp
功能: 对比两个文件字节的不同
[root@gaocun user]# cmp demo demo1
demo demo1 不同:第 1 字节,第 1

7.3 patch

复制代码
#patch
功能: 将差异打补丁

#制作补丁(认为demo1为目标文件,将差异打在demo.patch中)
diff -Naur demo demo1 > demo.patch

#更新补丁(用补丁去更新demo,更新完后demo和demo1完全相同)
patch -p0 demo < demo.patch

#还原补丁(还原更新后的demo)
patch -R -p0 demo < demo.patch
复制代码

8. pr 打开文件-显示打开时间-档案名-页码

[root@gaocun user]# pr demo
2022-05-08 15:25                      demo                       第 1 页
hahaha

 

posted @   学而不思则罔!  阅读(284)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
历史上的今天:
2020-05-08 06_数组
2020-05-08 05_IDEA
2020-05-08 04_流程控制语句
2020-05-08 03_方法
点击右上角即可分享
微信分享提示