• 【Linux】Linux文本处理-grep、awk、sed


    文章目录


    grep、awk、sed是Linux的三个文本操作指令。grep侧重单纯的查找与筛选,awk侧重格式化文本,sed侧重编辑匹配到的文本。

    1、grep

    Global Regular Expression Print,表示全局正则表达式。

    • 语法
    grep [参数] 样式 文件
    
    • 1
    • 参数
    参数含义
    -A后跟数字,除了符合样式的一行,并显示该行下面的n行
    -B后跟数字,除了符合样式的一行,并显示该行上面的n行
    -C后跟数字,除了符合样式的一行,并显示该行上下的n行
    -c返回匹配的行数
    -e实现逻辑or
    -E匹配多个样式,与-e相似
    -f后跟文件名,即把文件内容作为要匹配的样式
    -F将样式视为固定字符串
    -i忽略大小写
    -n显示匹配行的行号
    -o仅返回匹配到的字符串,而不是整行
    -q静默,不输出任何信息,用于脚本中
    -v反选
    -w匹配整个单词,而不是包含样式字符串就行
    • 用法举例

    经典用法---管道后的筛选

    //用于管道后的筛选
    
    ps -ef |grep -i redis
    kubectl get po -A|grep -vi run
    
    • 1
    • 2
    • 3
    • 4

    单独执行---查找匹配

    //参数用法举例
    
    > cat 1.txt
    aaaaaa
    bbbbbb
    --------------------------------------
    //-e与-E
    > grep -e aa -e bb 1.txt
    aaaaaa
    bbbbbb
    > grep -E "aa|bb" 1.txt
    aaaaaa
    bbbbbb
    
    --------------------------------------
    //有-F,aa*是一个固定字符串,而非匹配
    > grep 'aa*' 1.txt
    aaaaaa
    > grep -F 'aa*' 1.txt
    //空
    
    > grep -f file.txt 1.txt  //file.txt内容为a
    aaaaaa
    --------------------------------------
    //-w匹配整个单词
    > grep aaa 1.txt
    aaaaaa
    > grep -w aaa 1.txt
    //空
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29


    2、awk

    awk,即awk指令的三个作者的Family Name 的首字符。

    • 语法
      awk [参数] ‘script’ var=value file
      awk [参数] -f scriptfile var=value file
      精髓是:awk '{/条件/ 动作}' 文件名

    • 参数

    参数含义
    -F指定分隔符,默认是空格,如-F:
    -v定义一个变量,如-v a=1
    -f后跟脚本名,从脚本文件中读取awk指令
    • 用法举例
    //测试文件
    > cat 1.txt
    2 this is a test
    3 Do you like awk
    This's a test
    10 There are orange,apple,mongo
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    **用法1:格式化输出

    > awk '{print $1,$4}' 1.txt
     ---------------------------------------------
     2 a
     3 like
     This's
     10 orange,apple,mongo
    每行按空格或TAB分割,输出文本中的1、4列
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    **用法2:-F指定分隔符

    -F和使用内建变量FS的等价写法
    > awk -F, '{print $1,$2}'   1.txt
    > awk 'BEGIN{FS=","} {print $1,$2}'     1.txt
    
    指定多个分隔符
    > awk -F '[ ,]'  '{print $1,$2,$5}'   1.txt
     ---------------------------------------------
     2 this test
     3 Are awk
     This's a
     10 There apple
     -F '[ ,]'即先用空格分隔,对分隔结果在用逗号分隔
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    **用法3:awk -v设置变量

    > awk -va=1 '{print $1,$1+a}' 1.txt
     ---------------------------------------------
     2 3
     3 4
     This's 1
     10 11
     
    
    //注意二者的区别,下面这个是输出第一列和第1+a列
    > awk -va=1 '{print $1,$(1+a)}' 1.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    **用法4:从awk脚本中取awk指令

    awk -f {awk脚本} {文件名}
    
    > awk -f deploy.awk 1.txt
    
    • 1
    • 2
    • 3

    **用法5:正则表达式匹配

    1>匹配有re的行,并打印全行,以下三种写法等价
    ---------------------------------
    awk '/re/' 1.txt
    awk '/re/ {print}' 1.txt
    awk '/re/ {print $0}' 1.txt
    
    2>匹配有re的行,打印第二列和第四列
    --------------------------------- 
    awk '/re/ {print $2,$4}' 1.txt
    
    3>匹配第二列有re的行,打印第二列和第四列
    ---------------------------------
    awk '$2 ~ /re/ {print $2,$4}' 1.txt
    
    4> 匹配严格以This开头的行
    awk '/^This/' 1.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    **用法6:取反

    awk '!/th/ {print}' 1.txt
    awk '$2 !~ /th/ {print $2,$4}' 1.txt
    
    • 1
    • 2

    **用法7:忽略大小写

    awk 'BEGIN{IGNORECASE=1} /this/' 1.txt
    ---------------------------------------------
    2 this is a test
    This's a test
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

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

    有关awk的常用组合指令:

    #打印出网卡名和IP
    ip a|awk '/glo/ {print $NF ":\n" $2}'
    /glo/是去匹配包含glo字样的行,因为有配置IP地址的网口,必定IP的那一行是会有global字样的。最后一列是网卡名,第二列是IP地址。

    #K8s相关
    kubectl logs -f $(kubectl get po -A|awk ‘/pod-xxx/{print $2}’) -n namespace
    kubectl delete pod ${kubectl get -A|awk ‘/pending/{print $2}’) -n namespace



    3、sed

    依照脚本处理文件。

    • 语法
      sed [-e script语句] [-f script文件] [文本文件]

    • 参数
      -e:说明用脚本语句处理文件
      -f:说明用脚本文件处理文件

    动作符号含义
    a新增,后跟字符串,新字符串在指定行的下一行
    c取代
    d删除
    i插入,后跟字符串,新字符串在指定行的上一行
    p打印
    s取代
    • 用法举例
    //测试文件
    
    >cat testfile
    Hello world
    Java
    Extends
    PHP
    Testfile
    This is a testfile
    9527
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    // a新增
    sed 行号a\新加内容 文件名
    
    > sed -e 1a\aTestAdd testfile
    
    • 1
    • 2
    • 3
    • 4

    结果:
    在这里插入图片描述

    // d删除
    
    //删除第2-4行,没加-i,不改原文件
    > sed '2,4d' testfile
    
    • 1
    • 2
    • 3
    • 4

    结果:
    在这里插入图片描述

    • 经典用法–查找与替换

    sed 's/要被取代的字串/新的字串/g'

    sed -i 's/9527/code-9527/g' testfile
    
    • 1

    在这里插入图片描述

    同样的注意,不加-i,只是输出到控制台的被修改了,实际文件没变

    在这里插入图片描述

  • 相关阅读:
    党务管理系统搭建,答题获积分,学习有好礼
    php后端+JQuery+Ajax简单表单提交
    【斯坦福大学公开课CS224W——图机器学习】三、节点和图嵌入
    Vue基础(九)——ElementUI
    Angular 14 新的 inject 函数介绍
    那些程序员需要高频使用的神器
    OpenCV实战(30)——OpenCV与机器学习的碰撞
    高并发之线程池
    定时任务报警通知解决方案详解
    【JVM】垃圾回收机制中,对象进入老年代的触发条件
  • 原文地址:https://blog.csdn.net/llg___/article/details/126385592