Linux sed 和 awk 命令使用方法

Linux sed 命令使用方法

sed(Stream Editor)是 Linux 中强大的流编辑器,常用于文本替换、删除、插入等操作。

基本语法

bash 复制代码
sed [选项] '命令' 文件

常用选项

选项 说明
-i 直接修改文件(无输出)
-e 执行多个命令
-n 安静模式,只打印处理的行
-r-E 使用扩展正则表达式

核心命令

命令 说明
s/old/new/ 替换第一个匹配
s/old/new/g 全局替换
d 删除行
p 打印行
a 在行后追加
i 在行前插入
c 替换整行
y 字符转换

常用示例

1. 文本替换

bash 复制代码
# 替换首次匹配
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. 指定行操作

bash 复制代码
# 替换第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. 删除行

bash 复制代码
# 删除第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. 打印与查看

bash 复制代码
# 只打印第5行(需配合 -n)
sed -n '5p' file.txt

# 打印第3-7行
sed -n '3,7p' file.txt

# 打印匹配行
sed -n '/error/p' file.txt

5. 插入与追加

bash 复制代码
# 在第2行后追加
sed '2a\这是新行' file.txt

# 在第3行前插入
sed '3i\插入的内容' file.txt

# 在匹配行后追加
sed '/pattern/a\追加内容' file.txt

6. 多个命令

bash 复制代码
# 使用 -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. 使用变量

bash 复制代码
# 使用双引号以解析变量
old="hello"
new="world"
sed "s/$old/$new/g" file.txt

8. 常见实用场景

bash 复制代码
# 注释掉包含特定内容的行
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. 不加 -ised 只输出到屏幕,不修改原文件
  2. 使用 -i 建议先测试,或备份:sed -i.bak 's/old/new/g' file
  3. 正则中的特殊字符 需要转义:/*.[]
  4. 分隔符可自定义sed 's|/path/old|/path/new|'(用 | 避免转义)

Linux awk 命令使用方法

awk 是一种强大的文本处理工具和编程语言,擅长按列处理数据、格式化报告和文本分析。

基本语法

bash 复制代码
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. 基本打印操作

bash 复制代码
# 打印整行
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. 指定分隔符

bash 复制代码
# 使用冒号分隔(处理 /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. 模式匹配

bash 复制代码
# 匹配包含"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. 条件判断

bash 复制代码
# 数字比较
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. 行范围

bash 复制代码
# 打印第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

bash 复制代码
# 在开始和结束时执行
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. 字符串操作

bash 复制代码
# 字符串拼接
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. 数组操作

bash 复制代码
# 统计重复次数
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. 数学计算

bash 复制代码
# 平均值、最大值、最小值
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. 实战场景

bash 复制代码
# 查看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

高级技巧

格式化输出

bash 复制代码
# 对齐输出
awk '{printf "%-10s %5d\n", $1, $2}' file.txt

# 保留小数
awk '{printf "%.2f\n", $1/$2}' file.txt

多命令执行

bash 复制代码
# 使用分号
awk '{print $1; print $2}' file.txt

# 使用多个动作块
awk '{print $1} {print $2}' file.txt

外部变量

bash 复制代码
# 传递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

实用单行命令

bash 复制代码
# 计算文件行数
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
相关推荐
一拳一个娘娘腔6 小时前
Linux SSH免密登录:从“刷卡进门”到“刷脸通行”的完整指南
linux·运维·ssh
代码AC不AC6 小时前
【Linux】线程控制
linux·线程·线程控制
Chirp7 小时前
Windows下借助wsl2读取ext4格式磁盘
linux·windows
taocarts_bidfans7 小时前
反向海淘站点运维优化与常见技术问题排查
大数据·运维·跨境电商·独立站·反向海淘
IMPYLH7 小时前
Linux 的 whoami 命令
linux·运维·服务器·bash
头歌实践平台8 小时前
头歌静态路由与默认静态路由
运维·服务器·网络
NashSKY8 小时前
RK3588 Linux SDK 编译、烧录与 MIPI 屏配置流程
linux·rk3588
宋浮檀s8 小时前
DVWA通关教程2
运维·服务器·前端·javascript
JAVA社区8 小时前
Java进阶全套教程(七)—— Redis超详细实战详解
java·linux·开发语言·redis·面试·职场和发展