理解awk与sed的定位和基本语法
awk与sed是Linux文本处理的两大基石,但定位截然不同。awk擅长结构化数据的按行按列分析与统计,其基本语法为awk '模式 {动作}' 文件,默认以空白字符为分隔符将每行拆分为字段,逐行读取并执行动作块。sed则是流编辑器,定位为文本的流式筛选、替换与行级编辑,语法为sed '地址命令' 文件,它按行读入模式空间,匹配地址后执行替换、删除或打印,处理完即输出并清空空间。两者均采用标准输入或文件输入,执行逻辑均为逐行扫描。例如,awk '{print $1}' data.txt直接提取首列,而sed -n '2p' data.txt仅打印第二行。理解这种列分析与流编辑的差异,是高效组合使用的前提。

用awk完成筛选、列提取与统计
awk的核心优势在于字段操作与内置变量。通过$1、$2可直接引用列,NF记录当前行字段总数,NR记录当前行号。结合条件判断可实现精准筛选,如awk 'NR>1 && $3>50 {print $1, $2}' data.csv跳过表头并提取第三列大于50的前两列。格式化输出推荐使用printf,例如awk '{printf "%-10s %5.2f\n", $1, $2}'可对齐文本与浮点数。统计场景下,利用累加器与END块极为高效:awk '{sum+=$3} END {print "总和:", sum, "平均:", sum/NR}' file.txt。这些操作无需编写复杂脚本,单行命令即可完成数据清洗、列提取与基础统计,是运维与数据分析的利器。
用sed完成查找、替换与行编辑
sed的强项在于非交互式文本编辑,其核心是s/旧/新/标志替换命令。默认仅替换每行首个匹配项,添加g标志可实现全局替换,如sed 's/foo/bar/g' file.txt。通过指定行号或正则地址可精准控制范围,例如sed '3,5d'删除第3至5行,sed -n '/error/p'仅打印含error的行。正则表达式在sed中需遵循基础正则规范,特殊字符如.、*需转义或使用\(、\)分组。原地修改务必使用-i参数,但强烈建议配合备份后缀如sed -i.bak 's/old/new/g' file,以防误操作覆盖原文件。掌握地址寻址与替换标志,即可高效完成批量配置调整与文本清洗。

组合awk与sed处理实际文本任务
实际工作中,awk与sed常通过管道组合,形成清洗、筛选、统计的完整流水线。以处理Nginx访问日志为例,原始日志含方括号时间戳与多余空格,可先用sed清理:sed 's/\[//g; s/\]//g' access.log去除括号。随后管道传递给awk提取IP与状态码:awk '{print $1, $9}'。若需统计高频IP,可继续组合sort | uniq -c | sort -nr。完整命令为:cat access.log | sed 's/\[//g; s/\]//g' | awk '{print $1, $9}' | sort | uniq -c | sort -nr | head -10。sed负责预处理非结构化干扰字符,awk专注列提取与字段重组,两者互补避免了单一工具的语法臃肿,大幅提升复杂日志或配置文件的处理效率。

验证结果与常见避坑
执行文本处理后,验证与避坑是保障数据安全的关键。输出验证可使用diff对比修改前后文件,或通过head、wc -l核对行数与内容。常见陷阱包括:awk默认分隔符为空格或制表符,处理CSV需显式指定-F',';sed正则中/若作为匹配内容需转义为\/或改用|作为分隔符(如s|old|new|g)。引号使用需严格区分:单引号阻止Shell变量展开,双引号允许变量替换,涉及复杂正则时务必用单引号包裹sed或awk表达式。最危险的误操作是滥用sed -i,务必养成先无-i预览、确认无误后再加-i或-i.bak的习惯,必要时结合cp手动备份,确保生产环境文本修改可追溯、可回滚。

