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'

注意事项

  1. 不加 -i 时,sed 只输出到屏幕,不修改原文件
  2. 使用 -i 前建议先测试,或备份:sed -i.bak 's/old/new/g' file
  3. 正则中的特殊字符需要转义:/、*、.、[、]等
  4. 分隔符可自定义: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
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐