linux学习进展 sed awk

张开发
2026/5/14 17:34:51 15 分钟阅读

分享文章

linux学习进展 sed awk
在Linux系统中文本处理是日常运维、脚本开发的核心场景而sed和awk作为“Linux文本三剑客”与grep并列各自承担着不同的文本处理职责——sed擅长**行级编辑**专注于批量修改、删除、插入文本awk擅长**列级分析**专注于字段提取、数据统计、格式化输出。本次笔记将系统讲解sed和awk的基础语法、核心命令、实操案例明确两者的区别与适用场景帮助快速掌握这两个高频文本处理工具提升Linux文本操作效率。一、核心认知sed与awk的定位与区别sed和awk均为Linux内置的文本处理工具无需额外安装即可使用但两者的设计初衷和核心能力差异显著先明确定位避免混淆1. 工具定位sed全称Stream EDitor流编辑器非交互式文本编辑器以“行”为处理单位逐行读取文本、按规则处理、逐行输出默认不修改原文件擅长批量编辑文本内容如替换、删除、插入语法简单对列处理能力较弱。awk取自三位作者Alfred Aho、Peter Weinberger、Brian Kernighan的姓氏首字母是一种轻量级编程语言以“行”为单位读取文本以“列”为单位处理数据擅长结构化文本分析、字段提取、统计计算功能更复杂对列处理能力极强。2. 核心区别实操层面对比维度sedawk处理单位以“行”为核心整行处理不擅长拆分字段以“行”为基础以“列”为核心可灵活拆分字段核心功能批量替换、删除、插入、追加文本编辑文本内容字段提取、数据统计、条件筛选、格式化输出语法特点命令式语法简洁高效核心是“操作命令匹配规则”编程式语法支持变量、循环、条件、函数功能灵活适用场景批量修改配置文件、删除日志无效行、替换文本关键词分析日志提取IP、状态码、处理CSV文件、统计数据求和、计数补充与grep搭配使用三剑客组合可解决90%以上的Linux文本处理问题——grep负责“搜索匹配”sed负责“编辑修改”awk负责“分析计算”三者配合管道符|能高效处理复杂文本需求。二、sed工具详解行级编辑神器sed的核心逻辑是“匹配行 → 执行操作”无需打开文件即可完成批量编辑默认只输出处理结果不修改原文件需通过选项实现原文件修改重点掌握选项、核心命令和实操案例。1. sed基本语法sed的语法格式有两种核心一致可根据需求选择# 格式1直接执行单个操作命令 sed [选项] 操作命令 文件名 # 格式2通过脚本文件执行多个操作命令 sed [选项] -f 脚本文件 文件名2. 常用选项必记-n静默输出禁止默认打印所有行只打印匹配或指定的行配合打印命令p使用-i直接修改原文件慎用建议先不加-i测试效果确认无误后再添加-i.bak修改原文件前自动备份原文件备份文件后缀为.bak安全用法-e允许在同一行执行多个操作命令多命令批量处理-r支持扩展正则表达式简化复杂匹配规则-V查看sed版本信息。3. 核心操作命令高频必学sed的操作命令众多重点掌握以下6个高频命令覆盖80%的实操场景命令需放在单引号内配合匹配规则使用命令功能说明示例操作test.txt文件s替换文本substitute核心命令格式s/旧内容/新内容/标志sed s/old/new/g test.txt全局替换old为newd删除行delete格式匹配规则dsed 3d test.txt删除第3行a在匹配行后追加文本append格式匹配规则a\追加内容sed 2a\hello test.txt在第2行后追加helloi在匹配行前插入文本insert格式匹配规则i\插入内容sed 2i\hello test.txt在第2行前插入helloc替换整行文本change格式匹配规则c\替换内容sed 2c\hello test.txt将第2行替换为hellop打印匹配行print需配合-n选项使用sed -n 3p test.txt只打印第3行4. 实操案例重点掌握结合日常场景列举sed高频实操案例所有命令可直接复制执行建议结合test.txt文件自行创建测试练习# 案例1文本替换最常用 # 1. 替换每行第一个old为new默认只替换第一个 sed s/old/new/ test.txt # 2. 全局替换g标志替换所有匹配 sed s/old/new/g test.txt # 3. 忽略大小写替换i标志 sed s/old/new/gi test.txt # 4. 替换第2个匹配数字标志 sed s/old/new/2 test.txt # 5. 路径替换用|作为分隔符避免/转义 sed s|/bin/bash|/bin/sh|g /etc/passwd # 案例2删除行高频场景 # 1. 删除第3行 sed 3d test.txt # 2. 删除第3-5行 sed 3,5d test.txt # 3. 删除最后一行$表示行尾 sed $d test.txt # 4. 删除包含test的行正则匹配 sed /test/d test.txt # 5. 删除空行^$表示空行 sed /^$/d test.txt # 案例3插入/追加文本 # 1. 在第2行前插入文本 sed 2i\插入内容 test.txt # 2. 在包含error的行后追加文本 sed /error/a\错误行 test.txt # 3. 替换第2行整行内容 sed 2c\这一行被完全替换 test.txt # 案例4多命令批量处理-e选项 # 同时删除空行、全局替换old为new sed -e /^$/d -e s/old/new/g test.txt # 案例5修改原文件-i选项慎用 # 直接修改原文件替换old为new sed -i s/old/new/g test.txt # 修改原文件并备份推荐备份文件为test.txt.bak sed -i.bak s/old/new/g test.txt5. 常见技巧与注意事项sed默认不修改原文件测试时先不加-i确认输出结果正确后再添加-i修改原文件替换内容包含/时可使用|、#、作为分隔符避免转义如sed s#/home#/root#g test.txt正则匹配时^表示行首$表示行尾.表示任意单个字符*表示匹配零或多个前导字符如sed /^test/d test.txt删除以test开头的行使用-n选项时只有配合p命令才会打印指定行否则无输出。三、awk工具详解列级分析神器awk的核心逻辑是“读取行 → 拆分列 → 按规则处理列”将文本视为“行记录 列字段”的结构化数据支持变量、条件、循环、函数是处理日志、CSV文件的首选工具重点掌握基础语法、内置变量和实操案例。1. awk基本语法awk的语法比sed更灵活核心格式如下支持多种扩展写法# 核心格式模式筛选行 {动作处理列} awk [选项] 模式 {动作} 文件名 # 常用扩展格式多模式、多动作 awk [选项] BEGIN{初始化动作} 模式{动作} END{结束动作} 文件名说明BEGIN处理文本前执行如初始化变量、打印表头仅执行一次模式筛选需要处理的行如行号、正则匹配、条件判断可省略默认处理所有行动作对筛选后的行执行操作如打印列、计算、判断必须用{}包裹END处理完所有文本后执行如统计结果、输出总结仅执行一次。2. 常用选项必记-F指定字段分隔符默认以空格、制表符为分隔符如-F:以冒号为分隔符-v定义自定义变量如-v num10定义变量num的值为10-f执行awk脚本文件将复杂动作写入脚本批量执行-V查看awk版本信息。3. 核心内置变量高频必记awk的强大之处在于内置变量无需定义即可使用重点掌握以下变量覆盖大部分列处理场景$0表示当前整行内容$1、$2、$3...表示当前行的第1列、第2列、第3列...$1是第一列以此类推NF表示当前行的字段总数列数NR表示当前行的行号从1开始计数FS输入字段分隔符与-F选项功能一致可在BEGIN中定义OFS输出字段分隔符默认是空格可自定义RS记录分隔符默认是换行符即每行是一条记录。4. 核心动作高频必学awk的动作主要用于处理列数据常用动作包括打印、条件判断、计算、函数调用结合内置变量使用打印动作print/printfprint简单输出自动换行printf格式化输出需手动加\n换行条件动作if/else按条件筛选列执行不同操作计算动作求和、求平均、计数等支持加减乘除、取余运算函数动作内置字符串函数、数值函数如length求长度、int取整。5. 实操案例重点掌握结合日常运维场景日志分析、CSV处理、系统数据统计列举awk高频实操案例可直接复制执行# 案例1基础列提取最常用 # 1. 打印所有行等价于cat test.txt awk {print} test.txt awk {print $0} test.txt # 2. 打印第1列和第3列默认空格/制表符分隔 awk {print $1, $3} test.txt # 3. 指定分隔符以冒号分隔提取/etc/passwd的用户名和登录shell awk -F: {print $1, $7} /etc/passwd # 4. 打印行号和整行内容 awk {print NR, $0} test.txt # 5. 打印每行的列数和整行内容 awk {print NF, $0} test.txt # 案例2条件筛选与打印 # 1. 打印行号3-5的内容 awk NR3 NR5 {print} test.txt # 2. 打印第3列大于30的行假设第3列是数值 awk $330 {print $0} test.txt # 3. 打印包含test的行正则匹配 awk /test/ {print $1, $2} test.txt # 4. 打印第1列以J开头的行 awk $1 ~ /^J/ {print} test.txt # 5. 多条件筛选第2列20且第3列含Engineer awk $220 $3~/Engineer/ {print} test.txt # 案例3数据统计核心场景 # 1. 求第2列的总和与平均值 awk {sum$2; count} END {print 总和, sum, 平均值, sum/count} test.txt # 2. 统计各职位的人数假设第3列是职位 awk {pos[$3]} END {for(i in pos) print i, pos[i]} test.txt # 3. 找出第2列的最大值及对应行的第1列假设第2列是数值 awk BEGIN{max0} {if($2max){max$2; name$1}} END{print 最大值, max, 对应名称, name} test.txt # 案例4格式化输出printf # 左对齐10字符姓名、数字占3位年龄、右对齐15字符职位 awk {printf %-10s %3d %15s\n, $1, $2, $3} test.txt # 案例5字符串函数使用 # 打印第1列的长度、前3个字符 awk {print $1, length($1), substr($1,1,3)} test.txt # 案例6BEGIN和END的使用生成报表 awk BEGIN{ print 员工信息报表 printf %-10s %5s %15s\n, 姓名, 年龄, 职位 # 表头 } { printf %-10s %5d %15s\n, $1, $2, $3 # 内容 } END{ print 报表生成完成 # 结尾提示 } test.txt6. 常见技巧与注意事项处理CSV文件或/etc/passwd这类分隔符固定的文件时必须用-F指定分隔符否则无法正确拆分列awk的变量无需声明直接赋值即可使用如sum0count0数值运算默认是浮点数条件判断中字符串比较需加双引号如$3 Engineer数值比较无需加引号如$230循环和数组常用于统计场景如统计词频、分组统计awk的数组是关联数组无需指定长度printf格式化输出时需手动添加\n换行否则所有内容会输出在一行。四、sed与awk的组合使用实战进阶单独使用sed或awk已能处理大部分文本场景结合管道符|将两者组合可解决更复杂的文本处理需求列举2个高频组合案例# 案例1分析Nginx访问日志提取错误请求并统计IP # 需求从access.log中筛选出状态码404的行删除空行提取IP第1列统计每个IP的错误次数 sed /^$/d access.log | awk $9404 {print $1} | sort | uniq -c | sort -nr # 解析 # 1. sed /^$/d access.log删除日志中的空行 # 2. awk $9404 {print $1}筛选状态码第9列为404的行提取IP第1列 # 3. sort | uniq -c排序并统计每个IP的出现次数 # 4. sort -nr按次数倒序排列n数字排序r倒序 # 案例2批量修改配置文件并提取关键信息 # 需求将config.ini中所有old_ip替换为new_ip删除注释行以#开头提取配置项和值 sed -e s/old_ip/new_ip/g -e /^#/d config.ini | awk -F {print 配置项, $1, 值, $2} # 解析 # 1. sed多命令替换IP、删除注释行 # 2. awk以为分隔符提取配置项第1列和值第2列五、总结与核心要点本次笔记系统讲解了sed和awk的核心用法两者作为Linux文本处理的核心工具重点区分“行编辑”与“列分析”的定位掌握后能大幅提升文本处理效率核心要点总结如下sed行级编辑核心是“匹配行→执行操作”常用命令s替换、d删除、a/i追加/插入适合批量修改文本内容重点记住-i修改原文件、-n静默输出选项awk列级分析核心是“行→列→处理”常用内置变量$1、NF、NR支持条件、循环、函数适合日志分析、数据统计重点记住-F指定分隔符、BEGIN/END块区别记忆sed管“行”awk管“列”sed侧重“改”awk侧重“算”实战技巧先测试后修改sed慎用-i复杂场景结合grep、sort、uniq等工具提升处理效率学习建议无需死记所有语法结合实际场景练习如处理日志、配置文件遇到问题查手册man sed、man awk。

更多文章