Linux sed 和 awk 命令使用方法
Linuxsed命令使用方法sedStream Editor是 Linux 中强大的流编辑器常用于文本替换、删除、插入等操作。基本语法sed[选项]命令文件常用选项选项说明-i直接修改文件无输出-e执行多个命令-n安静模式只打印处理的行-r或-E使用扩展正则表达式核心命令命令说明s/old/new/替换第一个匹配s/old/new/g全局替换d删除行p打印行a在行后追加i在行前插入c替换整行y字符转换常用示例1. 文本替换# 替换首次匹配seds/old/new/file.txt# 全局替换seds/old/new/gfile.txt# 忽略大小写seds/old/new/gifile.txt# 只替换第2个匹配seds/old/new/2file.txt# 直接修改文件sed-is/old/new/gfile.txt2. 指定行操作# 替换第3行的内容sed3s/old/new/file.txt# 替换第2-5行的内容sed2,5s/old/new/file.txt# 替换以 root 开头的行sed/^root/s/bash/csh//etc/passwd3. 删除行# 删除第3行sed3dfile.txt# 删除第2-5行sed2,5dfile.txt# 删除空白行sed/^$/dfile.txt# 删除包含error的行sed/error/dfile.txt# 删除最后一行sed$dfile.txt4. 打印与查看# 只打印第5行需配合 -nsed-n5pfile.txt# 打印第3-7行sed-n3,7pfile.txt# 打印匹配行sed-n/error/pfile.txt5. 插入与追加# 在第2行后追加sed2a\这是新行file.txt# 在第3行前插入sed3i\插入的内容file.txt# 在匹配行后追加sed/pattern/a\追加内容file.txt6. 多个命令# 使用 -esed-es/old/new/-es/foo/bar/file.txt# 使用分号seds/old/new/; s/foo/bar/file.txt# 使用花括号针对特定行sed/pattern/{s/old/new/; s/foo/bar/}file.txt7. 使用变量# 使用双引号以解析变量oldhellonewworldseds/$old/$new/gfile.txt8. 常见实用场景# 注释掉包含特定内容的行sed/pattern/s/^/#/file.txt# 删除行首空格seds/^[ \t]*//file.txt# 删除行尾空格seds/[ \t]*$//file.txt# 提取IP地址ifconfig|sed-ns/.*inet \([0-9.]*\) .*/\1/p注意事项不加-i时sed只输出到屏幕不修改原文件使用-i前建议先测试或备份sed -i.bak s/old/new/g file正则中的特殊字符需要转义/、*、.、[、]等分隔符可自定义sed s|/path/old|/path/new|用|避免转义Linuxawk命令使用方法awk是一种强大的文本处理工具和编程语言擅长按列处理数据、格式化报告和文本分析。基本语法awk[选项]模式{动作}文件模式条件匹配可选动作要执行的命令用{}包围常用选项选项说明-F指定字段分隔符-v设置变量-f从脚本文件读取命令核心概念内置变量变量说明$0整行内容$1, $2...第1、2…列NF字段总数NR当前行号FNR当前文件的行号FS输入字段分隔符OFS输出字段分隔符RS输入记录分隔符ORS输出记录分隔符常用内置函数函数说明length(str)字符串长度tolower(str)转小写toupper(str)转大写substr(str, i, n)提取子串split(str, arr, sep)拆分字符串sprintf(fmt, expr)格式化输出常用示例1. 基本打印操作# 打印整行awk{print $0}file.txt# 打印第1列和第3列awk{print $1, $3}file.txt# 打印最后一列awk{print $NF}file.txt# 打印倒数第二列awk{print $(NF-1)}file.txt# 打印行号和内容awk{print NR: $0}file.txt2. 指定分隔符# 使用冒号分隔处理 /etc/passwdawk-F:{print $1, $3}/etc/passwd# 使用正则作为分隔符awk-F[ ,]{print $2}file.txt# 在BEGIN块中设置awkBEGIN{FS:} {print $1, $3}/etc/passwd# 输出时指定分隔符awkBEGIN{OFS---} {print $1, $2}file.txt3. 模式匹配# 匹配包含error的行awk/error/ {print $0}log.txt# 匹配以root开头的行awk/^root/ {print $0}/etc/passwd# 第3列匹配特定值awk$3 0 {print $1, $3}/etc/passwd# 第1列包含aliceawk$1 ~ /alice/ {print $0}file.txt# 不匹配awk$1 !~ /alice/ {print $0}file.txt4. 条件判断# 数字比较awk$3 1000 {print $1, $3}/etc/passwd# 复合条件awk$3 1000 $3 2000 {print $1, $3}/etc/passwd# if语句awk{if($3 1000) print $1, admin; else print $1, user}/etc/passwd# 三目运算符awk{print ($31000 ? admin : user)}/etc/passwd5. 行范围# 打印第2-5行awkNR2 NR5file.txt# 从匹配行开始打印awk/start/,/end/file.txt# 跳过前10行awkNR10file.txt# 打印奇数行awkNR%21file.txt6. BEGIN 和 END# 在开始和结束时执行awkBEGIN{print Start} {print $0} END{print End}file.txt# 计算总行数awkEND{print NR}file.txt# 计算某列总和awk{sum$1} END{print 总和:, sum, 平均值:, sum/NR}file.txt# 打印表头awkBEGIN{printf %-10s %-10s\n, 姓名, 分数} {printf %-10s %-10d\n, $1, $2}file.txt7. 字符串操作# 字符串拼接awk{print $1 $2}file.txt# 无空格awk{print $1, $2}file.txt# 有空格# 长度检查awklength($1) 5 {print $1}file.txt# 大小写转换awk{print toupper($1), tolower($2)}file.txt# 子串提取awk{print substr($1, 2, 3)}file.txt# 从第2字符取3个8. 数组操作# 统计重复次数awk{count[$1]} END{for(i in count) print i, count[i]}file.txt# 去除重复行awk!seen[$0]file.txt# 统计各IP访问次数awk{ip[$1]} END{for(i in ip) print i, ip[i]}access.log9. 数学计算# 平均值、最大值、最小值awk{sum$1; if($1max) max$1; if(min) min$1; if($1min) min$1} END{print 平均值:, sum/NR, 最大值:, max, 最小值:, min}file.txt# 格式化输出awk{printf %.2f\n, $1/100}file.txt10. 实战场景# 查看CPU使用率top-b-n1|awk/%Cpu/ {print $2}# 查看内存使用free-m|awkNR2{printf 已用: %.1f%%\n, $3/$2*100}# 统计日志中HTTP状态码awk{print $9}access.log|sort|uniq-c|sort-rn# 过滤并计算psaux|awk$35.0 {print $2, $3, $11}# CPU5%的进程# 多文件处理awkNRFNR{a[$1]$2; next} {print $1, a[$1]}file1.txt file2.txt高级技巧格式化输出# 对齐输出awk{printf %-10s %5d\n, $1, $2}file.txt# 保留小数awk{printf %.2f\n, $1/$2}file.txt多命令执行# 使用分号awk{print $1; print $2}file.txt# 使用多个动作块awk{print $1} {print $2}file.txt外部变量# 传递shell变量var100awk-vmyvar$var$1 myvarfile.txt# 使用多个变量awk-va$var1-vb$var2{print a, b, $0}file.txtsed vs awk 选择建议场景推荐简单替换、删除sed基于列的数据处理awk复杂文本转换awk正则替换sed数值计算、统计awk多文件关联处理awk实用单行命令# 计算文件行数awkEND{print NR}file.txt# 打印第10行awkNR10file.txt# 每行翻转列顺序awk{for(iNF;i0;i--) printf %s , $i; print }file.txt# 移除空行awkNFfile.txt# 添加行号awk{print NR, $0}file.txt