SuperAPI AI 工具集

sed-awk

办公与效率

查看项目

更新于 10-15 07:49

技能介绍

本页是 sed 与 awk 的实用速查参考,用于命令行文本处理。资料未提供该技能的安装方式、触发机制或运行环境等元信息,暂未提供。

一、sed 基础 替换:sed 's/old/new/' 替换每行首次出现;sed 's/old/new/g' 替换每行全部出现;GNU sed 支持 sed 's/old/new/gI' 进行大小写不敏感替换。 删行:sed '5d' 删除第 5 行;sed '5,10d' 删除第 5 至 10 行;sed '/^$/d' 删除空行;sed '/DEBUG/d' 删除匹配模式的行。 插入与追加:sed '3i\new line here' 在第 3 行前插入;sed '3a\new line here' 在第 3 行后追加。 原地编辑:GNU sed 使用 sed -i 's/old/new/g' file.txt;BSD sed(macOS)需要备份扩展名,如 sed -i '' 's/old/new/g' file.txt;两者可统一用 sed -i.bak 保留备份。

二、sed 地址 支持按行号(3s/old/new/)、行范围(3,7s/old/new/)、从匹配到文件末尾(/START/,$s/old/new/)、两个模式之间(/BEGIN/,/END/s/old/new/);GNU 还支持步进 1~2s/old/new/ 表示每隔 2 行;sed '/KEEP/!d' 可反选,仅保留匹配行。

三、sed 正则 基础正则使用捕获组与反向引用 sed 's/(foo)(bar)/\2\1/';扩展正则用 -E 免去括号转义 sed -E 's/(foo)(bar)/\2\1/'。示例包括日期重排 2024-01-15 转 01/15/2024、用 sed -E 's/<[^>]+>//g' 去除 HTML 标签、用 sed -E 's/^[[:space:]]+//; s/[[:space:]]+$//' 去除首尾空白。多命令可用 -e 串联或用分号:sed -e 's/foo/bar/' -e 's/baz/qux/',或 sed 's/foo/bar/; s/baz/qux/'。

四、awk 基础 打印列:awk '{print $2}' 输出第二列(默认按空白分隔);awk '{print $1, $3}' 输出第一、三列;awk '{print $NF}' 输出最后一列。 字段分隔符:awk -F',' '{print $2}' 处理 CSV;awk -F':' '{print $1, $3}' /etc/passwd 处理冒号分隔;awk -F'[,;]' 支持多分隔符;可用 -v OFS='\t' 设置输出分隔符。 内置变量:NR 当前行号、NF 当前行字段数、FS/OFS 输入输出字段分隔符、FILENAME 当前输入文件名,均可直接引用。

五、awk 模式与动作 BEGIN 与 END 块可在处理前后输出表头表尾或统计行数,如 awk 'END{print NR, "lines"}'。条件判断支持数值比较 awk '$3 > 100'、模式匹配 awk '/ERROR/'、反选 awk '!/DEBUG/'、字段相等 awk '$1 == "admin" {print $2}'、字段正则匹配 awk '$2 ~ /^192.168/',以及 if-else 输出 pass/fail。算术方面可对列求和、求平均、求最大值。字符串函数包括 split 拆分、substr 截取(1 起始)、gsub/sub 替换、match 配合 RSTART/RLENGTH 提取、printf 格式化、length、tolower、toupper。

六、常见配方 包括从 CSV 取列(简单场景及带引号字段的简化处理,复杂情况建议使用正规解析器)、从 Apache 日志提取 IP 与 URL、从 syslog 提取时间戳与消息、跨文件批量重命名(先预览再执行)、交换字段、去重(awk '!seen[$0]++' 或按指定列去重)、按列求和、打印两个标记之间的行(不含标记)、用 paste 合并、为每行加前缀、删除行尾回车、提取引号内的值、按频次统计唯一值等。

七、sed 与 awk 的选择 查找替换、按模式删除或过滤行、原地编辑文件适合用 sed;列提取、算术聚合、逐行条件逻辑、结构化文本重排适合用 awk。经验法则是:需要列或数学运算用 awk,需要搜索替换或删行用 sed。

八、注意事项 GNU 与 BSD sed 存在差异:原地编辑写法不同,替换中的 \t、大小写不敏感标志 I、步进 1~2、基础正则中的 + 与 ? 在 BSD 上不受支持。资料建议的可移植做法是统一使用 -E 表示扩展正则、使用 -i.bak 进行原地编辑。Shell 引用方面,单引号可阻止展开,双引号会展开 shell 变量;使用替代分隔符可避免斜杠转义;向 awk 传递 shell 变量应使用 -v,不要直接在 awk 单引号块中嵌入 shell 变量。资料同时提醒,复杂 CSV(含引号字段等)应使用更合适的解析工具而非仅靠 awk 分隔处理。