Linux sed 命令使用方法
sed(Stream Editor)是 Linux 中强大的流编辑器,常用于文本替换、删除、插入等操作。
基本语法
sed [选项] '命令' 文件
常用选项
| 选项 |
说明 |
-i |
直接修改文件(无输出) |
-e |
执行多个命令 |
-n |
安静模式,只打印处理的行 |
-r 或 -E |
使用扩展正则表达式 |
核心命令
| 命令 |
说明 |
s/old/new/ |
替换第一个匹配 |
s/old/new/g |
全局替换 |
d |
删除行 |
p |
打印行 |
a |
在行后追加 |
i |
在行前插入 |
c |
替换整行 |
y |
字符转换 |
常用示例
1. 文本替换
# 替换首次匹配
sed 's/old/new/' file.txt
# 全局替换
sed 's/old/new/g' file.txt
# 忽略大小写
sed 's/old/new/gi' file.txt
# 只替换第2个匹配
sed 's/old/new/2' file.txt
# 直接修改文件
sed -i 's/old/new/g' file.txt
2. 指定行操作
# 替换第3行的内容
sed '3s/old/new/' file.txt
# 替换第2-5行的内容
sed '2,5s/old/new/' file.txt
# 替换以 root 开头的行
sed '/^root/s/bash/csh/' /etc/passwd
3. 删除行
# 删除第3行
sed '3d' file.txt
# 删除第2-5行
sed '2,5d' file.txt
# 删除空白行
sed '/^$/d' file.txt
# 删除包含"error"的行
sed '/error/d' file.txt
# 删除最后一行
sed '$d' file.txt
4. 打印与查看
# 只打印第5行(需配合 -n)
sed -n '5p' file.txt
# 打印第3-7行
sed -n '3,7p' file.txt
# 打印匹配行
sed -n '/error/p' file.txt
5. 插入与追加
# 在第2行后追加
sed '2a\这是新行' file.txt
# 在第3行前插入
sed '3i\插入的内容' file.txt
# 在匹配行后追加
sed '/pattern/a\追加内容' file.txt
6. 多个命令
# 使用 -e
sed -e 's/old/new/' -e 's/foo/bar/' file.txt
# 使用分号
sed 's/old/new/; s/foo/bar/' file.txt
# 使用花括号(针对特定行)
sed '/pattern/{s/old/new/; s/foo/bar/}' file.txt
7. 使用变量
# 使用双引号以解析变量
old="hello"
new="world"
sed "s/$old/$new/g" file.txt
8. 常见实用场景
# 注释掉包含特定内容的行
sed '/pattern/s/^/#/' file.txt
# 删除行首空格
sed 's/^[ \t]*//' file.txt
# 删除行尾空格
sed 's/[ \t]*$//' file.txt
# 提取IP地址
ifconfig | sed -n 's/.*inet \([0-9.]*\) .*/\1/p'
注意事项
- 不加
-i 时 ,sed 只输出到屏幕,不修改原文件
- 使用
-i 前 建议先测试,或备份:sed -i.bak 's/old/new/g' file
- 正则中的特殊字符 需要转义:
/、*、.、[、]等
- 分隔符可自定义 :
sed 's|/path/old|/path/new|'(用 | 避免转义)
Linux awk 命令使用方法
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.txt
2. 指定分隔符
# 使用冒号分隔(处理 /etc/passwd)
awk -F: '{print $1, $3}' /etc/passwd
# 使用正则作为分隔符
awk -F'[ ,]+' '{print $2}' file.txt
# 在BEGIN块中设置
awk 'BEGIN{FS=":"} {print $1, $3}' /etc/passwd
# 输出时指定分隔符
awk 'BEGIN{OFS="---"} {print $1, $2}' file.txt
3. 模式匹配
# 匹配包含"error"的行
awk '/error/ {print $0}' log.txt
# 匹配以root开头的行
awk '/^root/ {print $0}' /etc/passwd
# 第3列匹配特定值
awk '$3 == 0 {print $1, $3}' /etc/passwd
# 第1列包含"alice"
awk '$1 ~ /alice/ {print $0}' file.txt
# 不匹配
awk '$1 !~ /alice/ {print $0}' file.txt
4. 条件判断
# 数字比较
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 ($3>1000 ? "admin" : "user")}' /etc/passwd
5. 行范围
# 打印第2-5行
awk 'NR>=2 && NR<=5' file.txt
# 从匹配行开始打印
awk '/start/,/end/' file.txt
# 跳过前10行
awk 'NR>10' file.txt
# 打印奇数行
awk 'NR%2==1' file.txt
6. BEGIN 和 END
# 在开始和结束时执行
awk 'BEGIN{print "Start"} {print $0} END{print "End"}' file.txt
# 计算总行数
awk 'END{print NR}' file.txt
# 计算某列总和
awk '{sum+=$1} END{print "总和:", sum, "平均值:", sum/NR}' file.txt
# 打印表头
awk 'BEGIN{printf "%-10s %-10s\n", "姓名", "分数"} {printf "%-10s %-10d\n", $1, $2}' file.txt
7. 字符串操作
# 字符串拼接
awk '{print $1 $2}' file.txt # 无空格
awk '{print $1, $2}' file.txt # 有空格
# 长度检查
awk 'length($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.log
9. 数学计算
# 平均值、最大值、最小值
awk '{sum+=$1; if($1>max) max=$1; if(min=="") min=$1; if($1<min) min=$1}
END{print "平均值:", sum/NR, "最大值:", max, "最小值:", min}' file.txt
# 格式化输出
awk '{printf "%.2f\n", $1/100}' file.txt
10. 实战场景
# 查看CPU使用率
top -b -n 1 | awk '/%Cpu/ {print $2}'
# 查看内存使用
free -m | awk 'NR==2{printf "已用: %.1f%%\n", $3/$2*100}'
# 统计日志中HTTP状态码
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# 过滤并计算
ps aux | awk '$3>5.0 {print $2, $3, $11}' # CPU>5%的进程
# 多文件处理
awk 'NR==FNR{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变量
var="100"
awk -v myvar="$var" '$1 > myvar' file.txt
# 使用多个变量
awk -v a="$var1" -v b="$var2" '{print a, b, $0}' file.txt
sed vs awk 选择建议
| 场景 |
推荐 |
| 简单替换、删除 |
sed |
| 基于列的数据处理 |
awk |
| 复杂文本转换 |
awk |
| 正则替换 |
sed |
| 数值计算、统计 |
awk |
| 多文件关联处理 |
awk |
实用单行命令
# 计算文件行数
awk 'END{print NR}' file.txt
# 打印第10行
awk 'NR==10' file.txt
# 每行翻转列顺序
awk '{for(i=NF;i>0;i--) printf "%s ", $i; print ""}' file.txt
# 移除空行
awk 'NF' file.txt
# 添加行号
awk '{print NR, $0}' file.txt