极简入门:Linux 文本处理三剑客:grep、sed、awk 深度解析

在 Linux 系统中,grepsed 和 awk 被合称为「文本处理三剑客」,它们各自拥有独特的定位和功能,但又能通过管道协作实现复杂的文本处理任务。本文将深入解析它们的核心功能、差异、典型场景及组合使用技巧。


一、差异与适用场景

​工具​​处理单位​​编程能力​​典型用途​
grep快速过滤行
sed简单命令行级编辑(替换、删除等)
awk列+行完整脚本语言列计算、复杂逻辑处理

​选择建议​​:

  • ​简单过滤行​​ → grep
  • ​行级编辑​​ → sed
  • ​列处理、复杂逻辑​​ → awk
  • ​组合任务​​ → 管道串联(如 grep | sed | awk

二、核心定位与功能对比

1. ​​grep:行过滤器​

  • ​核心功能​​:快速过滤匹配特定模式的行,支持正则表达式。
  • ​​快速开始:
    • #搜索当前目录下文件中包含search-word的行
      grep  "search-word" .
    • #递归搜索特定目录下包含search-word的行
      grep -r "search-word" /path/to/directory
  • ​常用参数​​:
    • -i(忽略大小写)、-v(反向匹配)、-n(显示行号)、-r(递归搜索目录)

2. ​​sed:流式文本编辑器​

  • ​核心功能​​:逐行处理文本,支持替换、删除、插入等操作。
  • ​快速开始:
    • sed 's/cat/dog/g' text.txt

      将文件 text.txt 中所有的cat “” 替换为 “dog”,这里的 /g 表示global全局替换,

    • sed 's/cat/dog/' text.txt

      省略 /g,只会替换每一行中第一个出现的 “cat”

  • ​常用参数
    • s(替换)、d(删除行)、a(追加行)、i(插入行)
    • -i(直接修改源文件,慎用)

3. ​​awk:结构化文本处理器​

  • ​核心功能​​:awk 默认以空白字符(空格或制表)符作为字段分隔符
  • ​快速开始:创建 user.txt
    //user.txt
    name age email
    John 30 john@example.com
    Alice 25 alice.work@example.com alice.personal@gmail.com
    Bob 35 bob123@yahoo.com
    Charlie 28 charlie.work@company.com
    Charlie 28 charlie.home@service.com 
    Charlie 28 charlie.other@domain.net
    David 40 david.email@host.com
    • 字段处理
      # run
      awk '{print $2,$1}' user.txt
      
      #output
      age name
      30 John
      25 Alice
      35 Bob
      28 Charlie
      28 Charlie
      28 Charlie
      40 David
      
    • 条件处理:
      # run 筛选条件:age大于30
      awk '$2 > 30' user.txt
      
      # output
      name age email #a的ASCII大于30
      Bob 35 bob123@yahoo.com
      David 40 david.email@host.com
      
    • 格式化输出
      # run
      awk '{printf "%s %.2f\n", $1,$2}' user.txt
      
      #output
      name 0.00
      John 30.00
      Alice 25.00
      Bob 35.00
      Charlie 28.00
      Charlie 28.00
      Charlie 28.00
      David 40.00
    • NR参数
      刚刚的输出,观察到也会格式化第一条,加入行号条件判断
      awk '{if (NR == 1) print $1, $2; else printf "%s %.2f\n", $1, $2}' user.txt
      
      # output
      name age
      John 30.00
      Alice 25.00
      Bob 35.00
      Charlie 28.00
      Charlie 28.00
      Charlie 28.00
      David 40.00
      
      反馈行号
      awk '{print NR, $0}' user.txt
      
      # output
      1 name age email
      2 John 30 john@example.com
      3 Alice 25 alice.work@example.com alice.personal@gmail.com
      4 Bob 35 bob123@yahoo.com
      5 Charlie 28 charlie.work@company.com
      6 Charlie 28 charlie.home@service.com 
      7 Charlie 28 charlie.other@domain.net
      8 David 40 david.email@host.com
      
  • ​核心变量​​:
    • $0(整行)、$1, $2...(第1、2列)、NF(列数)、NR(当前行号)

三、协作技巧

1. ​​正则表达式协作​

三者均支持正则表达式,但语法略有差异:

  • grep 和 sed 使用基础正则表达式;
  • awk 需使用扩展正则表达式(如 \d 需写成 [0-9]

2. ​​管道串联示例​

提取 IP 地址并统计出现次数

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10

3. ​​互补性操作​

  • awk 内置 grep 功能(通过 ~ 匹配),可替代部分 sed 操作
  • sed 适合简单替换,而 awk 支持条件替换(如仅修改第二列)

四、总结与学习建议

  • ​总结​​:
    grep 是「找什么」,sed 是「改什么」,awk 是「分什么」
  • ​学习优先级​​:
    建议从 grep 入门,逐步掌握 sed,最后挑战 awk

掌握这三剑客的组合使用,能让你在 Linux 环境下的文本处理效率大大提升。无论是日志分析、数据清洗还是自动化脚本编写,它们都是不可或缺的利器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值