一、管道(Pipe):连接命令的桥梁
1.1 什么是管道
管道是Linux中最强大的特性之一,它使用 | 符号将前一个命令的标准输出(stdout)传递给后一个命令的标准输入(stdin),实现命令间的数据流转。
1.2 管道的作用场景
核心思想:让每个命令专注于做好一件事,通过管道组合完成复杂任务。
bash
# 场景1:查找包含特定关键词的进程并杀死
ps -ef | grep "nginx" | grep -v grep | awk '{print $2}' | xargs kill -9
# 场景2:统计访问日志中某个IP的出现次数
cat access.log | grep "192.168.1.100" | wc -l
# 场景3:查看占用内存最多的前10个进程
ps aux | sort -k4 -nr | head -10
# 场景4:从历史命令中快速查找
history | grep "docker" | tail -10
1.3 管道与重定向的区别
特性 管道 | 重定向 > >> < 数据流向 命令之间传递 命令与文件之间 来源 前一个命令的stdout 文件或设备 去向 后一个命令的stdin 文件或设备
二、Awk:强大的文本分析工具
2.1 Awk是什么
Awk是一个模式扫描与处理语言,擅长对文本按行读取、按字段切割、进行格式化输出和统计计算。
核心工作流程:
逐行读入 → 按分隔符切片 → 对切片进行处理 → 输出结果
2.2 常用参数详解
参数 说明 场景示例 FS 输入域分隔符(等价于 -F) 处理非默认分隔符的文件 OFS 输出域分隔符 自定义输出格式,如 OFS="," RS 记录分隔符(默认换行符) 处理多行组成一条记录的数据 ORS 输出记录分隔符 自定义行尾符 NF 当前行的字段总数(列数) 判断列数是否符合预期 NR 当前行号(已读取的记录数) 按行号筛选数据 FILENAME 当前正在处理的文件名 多文件处理时区分来源 0当前行的全部内容打印完整行1~$n 第1到第n个字段 提取指定列数据 BEGIN 处理文件前执行的操作 添加表头、初始化变量 END 处理文件后执行的操作 输出汇总统计结果
2.3 Awk实战场景详解
场景1:搜索/etc/passwd中带root的用户,显示其shell
bash
# 需求:在/etc/passwd中查找root用户,输出其登录shell
awk -F: '/root/{print $7}' /etc/passwd
# 输出:/bin/bash
场景分析:/etc/passwd 以 : 为分隔符,第1列是用户名,第7列是shell路径。/root/ 是模式匹配,只处理包含"root"的行。运维场景中常用于检查用户配置是否正确。
场景2:打印/etc/passwd的第二行
bash
# 需求:查看passwd文件的第二行完整内容
awk -F: 'NR==2{print $0}' /etc/passwd
# NR==2 表示只处理第2行,$0 表示输出整行
场景3:添加标题行(BEGIN的应用)
bash
# 需求:在输出结果前加上表头
awk 'BEGIN {print "用户名", "UID"} {print $1, $3}' /etc/passwd
# 输出:
# 用户名 UID
# root 0
# bin 1
# ...
场景分析:BEGIN块在处理文件前执行,非常适合添加表头、打印分隔线或初始化累加变量。
场景4:自定义记录分隔符(RS的应用)
bash
# 需求:处理以"|"分隔的多条记录
echo "111 222|333 444|555 666" | awk 'BEGIN{RS="|"} {print $0}'
# 输出:
# 111 222
# 333 444
# 555 666
场景分析:当数据不是按行分隔,而是按特定符号(如 |、\n\n 空行)分隔记录时,修改RS非常有用。常见于处理日志段落或接口返回数据。
场景5:统计日志中每个IP的访问次数
bash
# 需求:统计access.log中每个IP的访问次数,按降序排列
awk '{print $1}' access.log | sort | uniq -c | sort -nr
场景分析:运维场景的经典用法。假设access.log中第1列是IP地址,先提取IP,再排序去重统计,最后降序排列查看高频访问IP,可用于安全审计或流量分析。
场景6:计算某列的平均值
bash
# 需求:计算成绩文件中第2列(分数)的平均值
awk '{sum += $2; count++} END {print "平均分:", sum/count}' scores.txt
场景分析:END块在处理完所有行后执行,适合做汇总统计。常用于性能数据分析、报表生成。
2.4 三种执行方式
方式 命令格式 适用场景 命令行方式 awk 'pattern{action}' file 单行简单处理 脚本方式 awk -f script.awk file 复杂逻辑复用 可执行脚本 #!/bin/awk -f 作为独立命令
三、Sed:流编辑器
3.1 Sed是什么
Sed(Stream Editor)是流编辑器,逐行读取文件内容到模式空间(pattern space)进行编辑处理,不改变原始文件(除非使用 -i 选项)。
核心原则:非交互式、逐行处理、一次一行。
3.2 常用动作详解
动作 参数格式 说明 场景示例 a '行号a 新内容' 在指定行后新增 配置文件中追加配置项 i '行号i 新内容' 在指定行前插入 在首行插入注释或版权信息 d '行号范围d' 删除指定行 删除空行或注释行 p '/pattern/p' 打印匹配行(常与-n配合) 快速过滤查看 s 's/old/new/g' 字符串替换 批量修改配置参数 c '行号范围c 新内容' 整行替换 替换整个段落配置
3.3 Sed实战场景详解
场景1:查看帮助与测试
bash
# 查看帮助文档
man sed
sed --help
# 测试替换(不修改原文件)
echo "hello world" | sed 's/world/test/'
# 输出:hello test
场景2:在指定行后新增内容(a)
bash
# 需求:在第4行后添加一行 "newline"
sed -e '4a newline' testfile.txt
# 场景:在nginx.conf的http块后添加日志格式配置
sed -e '/http {/a \ log_format main "$remote_addr - $remote_user"' nginx.conf
场景3:在指定行前插入内容(i)
bash
# 需求:在第2行前插入 "newline"
sed -e '2i newline' testfile.txt
# 场景:在配置文件开头插入作者信息
sed -e '1i # Author: admin@example.com' config.ini
场景4:删除指定行或行范围(d)
bash
# 需求:删除第2到第5行
sed -e '2,5d' testfile.txt
# 需求:删除所有空行
sed -e '/^$/d' file.txt
# 需求:删除所有以#开头的注释行
sed -e '/^#/d' config.conf
# 场景:清理配置文件中的注释和空行,获取有效配置
grep -v '^#' nginx.conf | sed '/^$/d'
场景5:打印匹配行(p)
bash
# 需求:只打印包含"root"的行(-n抑制默认输出)
sed -n '/root/p' /etc/passwd
# 场景:快速查看日志中包含ERROR的行
sed -n '/ERROR/p' app.log
场景6:字符串替换(s)
bash
# 需求:将文件中所有的"old"替换为"new"
sed -e 's/old/new/g' testfile.txt
# 需求:仅替换每行第一个匹配
sed -e 's/old/new/' testfile.txt
# 场景:批量修改MySQL配置中的内存参数
sed -i 's/innodb_buffer_pool_size = 128M/innodb_buffer_pool_size = 512M/g' my.cnf
# 场景:替换IP地址(注意转义)
sed -i 's/192.168.1.100/192.168.1.200/g' /etc/hosts
场景7:整行替换(c)
bash
# 需求:将第2到第5行替换为一行 "No 2-5 number"
sed -e '2,5c No 2-5 number' testfile.txt
# 场景:替换整个server配置块
sed -i '/server {/,/}/c server { listen 80; }' nginx.conf
3.4 重要选项
选项 说明 场景 -e 执行脚本/命令 多个编辑操作 -n 取消默认输出 配合p只打印匹配行 -i 直接修改文件(慎用!) 批量修改配置 -f 从文件读取sed脚本 复杂编辑复用
⚠️ 重要提醒:-i 选项会直接修改原文件,生产环境建议先备份!
bash
# 安全做法:先备份再修改
sed -i.bak 's/old/new/g' file.txt
3.5 Sed与正则表达式配合
bash
# 删除所有空白行
sed -i '/^[[:space:]]*$/d' file.txt
# 替换行首的特定字符
sed -i 's/^/ /' file.txt # 每行行首添加两个空格(缩进)
# 删除行尾空格
sed -i 's/[[:space:]]*$//' file.txt
# 匹配数字替换
sed -i 's/[0-9]\+/100/g' file.txt
四、三剑客使用场景对比
场景 推荐工具 原因 按列提取数据 Awk 天然支持字段分割、列运算 按行过滤数据 Sed/Grep 简单高效 统计汇总、求和平均 Awk 支持变量、循环、运算 批量替换文本 Sed 流式编辑,高效快捷 删除行、增改行 Sed 专注文本编辑 复杂日志分析 Awk + Sed + 管道 各取所长,组合使用
典型组合场景
bash
# 场景:分析Nginx访问日志,统计每个URL的访问次数并排序
cat access.log | awk '{print $7}' | sort | uniq -c | sort -nr | head -20
# 场景:查看所有非root用户的uid和家目录
awk -F: '$3 >= 1000 {print $1, $6}' /etc/passwd
# 场景:批量修改配置文件中的数据库连接信息
sed -i 's/db_host=localhost/db_host=192.168.1.100/g' config.ini
# 场景:从ps输出中提取PID和CPU使用率
ps aux | awk 'NR>1 {print $2, $3}' | head -10
五、思维导图总结
scss
Linux三剑客
│
├── 管道 (|)
│ ├── 作用:连接命令,数据流转
│ ├── 场景:复杂命令组合
│ └── 本质:stdout → stdin
│
├── Awk (文本分析)
│ ├── 核心:逐行读取 → 按域切割 → 处理 → 输出
│ ├── 常用参数:FS, OFS, RS, ORS, NF, NR, $0, $n
│ ├── 特殊块:BEGIN, END
│ └── 场景:列提取、统计汇总、格式化输出
│
└── Sed (流编辑)
├── 核心:逐行处理,一次一行
├── 动作:a(后增) i(前插) d(删除) p(打印) s(替换) c(整行替换)
├── 选项:-e -n -i -f
└── 场景:批量替换、删除行、修改配置
学习建议:三剑客的核心在于"组合使用",建议在日常工作中多尝试用命令行解决文本处理问题,逐步形成"管道思维"------让数据在命令之间流动,每个命令只做一件事,把它做到极致。
下一期预告:Bash编程语法与脚本编写实战
本文内容整理自霍格沃兹测试学院课程,旨在帮助测试开发工程师掌握Linux三剑客的核心技能。