awk 与 sed 是经典的命令行流式文本编辑器,主要用于对文本或命令输出进行逐行、按字段的处理。它们适合在终端中快速完成文本清洗、字段提取、条件筛选和批量替换等任务。
用途 sed 以“行”为单位进行文本编辑,常见用途包括替换、删除、打印指定行、在匹配行前后插入或追加内容。awk 以“记录与字段”为单位处理数据,常见用途包括按列输出、按分隔符解析、按条件过滤行以及对某列进行求和等统计。
主要能力 sed 方面:sed 's/old/new/' 替换每行首个匹配;sed 's/old/new/g' 替换每行全部匹配;sed -i 原地编辑(GNU),sed -i.bak 原地编辑并保留备份;sed '/pattern/d' 删除匹配行;sed '/^$/d' 删除空行;sed -n '5p' 打印第 5 行;sed -n '5,10p' 打印第 5 至 10 行;sed -n '/start/,/end/p' 打印两个模式之间的行;sed '/pattern/a\new line' 在匹配行后追加;sed '/pattern/i\new line' 在匹配行前插入。 awk 方面:awk '{print $2}' 打印指定列;awk -F: '{print $1}' 指定字段分隔符;awk '$3 > 100 {print $0}' 按列值条件输出;awk '/error/ {print $0}' 使用模式-动作块;awk '{sum += $2} END {print sum}' 对某列求和;awk 'BEGIN {FS=":"} {print $1} END {print "done"}' 使用 BEGIN/END 块;awk '{print $NF}' 打印最后一个字段;awk '{$1=""; print $0}' 打印除首列外的内容。
使用方式 两者均为 CLI 工具,无持久化配置,直接按命令调用;无持久化日志,输出到终端。安装方面,sed 通常系统预装;gawk 在 Debian 系可用 apt install gawk,在 Fedora 系可用 dnf install gawk。
适用场景 适合日志筛选、CSV 或冒号分隔文件的列提取、配置文件批量替换、按行号或模式定位内容、简单汇总统计等命令行文本处理任务。
限制与常见问题 sed -i 在 macOS 上会报错,因为 BSD sed 需要空字符串参数 sed -i '';跨平台更稳妥的写法是 sed -i.bak,两端均可用并保留备份,也可通过 brew 安装 GNU sed。sed 的捕获组引用是 \1 而非 $1,可写成 sed 's/(pattern)/\1/',或使用扩展正则 sed -E 's/(pattern)/\1/'。awk 使用 -F 指定分隔符时,若分隔符是多个空格或制表符,可能无法正确切分,可用 -F'[ \t]+' 或使用默认 FS(不传 -F),默认会按任意空白切分并忽略前导空白。对 $1 赋空值会按当前 OFS 重写 $0,若后续分隔符重要,应在 BEGIN 中设置 OFS。gawk 的 gensub、带数组的 match、多维数组、PROCINFO 等属于 gawk 扩展,在 POSIX awk、mawk(Ubuntu 默认)或 nawk 上可能静默失败或报错。若替换影响行数过多,说明 sed 命令缺少地址限制,可加行号或模式地址,如 sed '3s/old/new/' 或 sed '/pattern/s/old/new/'。此外,sed 默认一次处理一行,多行模式需要保持空间技巧(H、G、N),或改用更合适的工具(如带 RS 的 awk、perl、python),否则容易产生不易察觉的错误。