Linux三剑客与管道使用全解析:从入门到实战

一、管道(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当前行的全部内容打印完整行0 当前行的全部内容 打印完整行 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三剑客的核心技能。

相关推荐
dddwjzx1 小时前
嵌入式Linux C应用编程——输入设备
linux·嵌入式
lightqjx2 小时前
【Linux系统】程序地址空间(初识)
linux·页表·地址空间
wljy12 小时前
二、线程操作
linux·线程属性·线程操作
mounter6252 小时前
探索未来 AI 算力网络的基石:从传统 RoCE 走向 SRv6 驱动的弹性弹性网络(解析 Netdev 0x1A 创新实践)
linux·网络·人工智能·linux kernel·kernel·rdma·rocev2
x_x-F3 小时前
深入浅出 Linux 网络核心:sk_buff 的内存与指针流转
linux·运维·网络
潘正翔13 小时前
docker核心概念
linux·运维·服务器·docker·容器·centos·运维开发
weigangwin13 小时前
agent-workspace-linux 不是远程桌面:Linux AI 工作区的隔离边界验收
linux·xvfb·mcp·桌面隔离·权限边界·bubblewrap·agent-workspace
Dovis(誓平步青云)15 小时前
远程办公软件文件传输实测:6 款工具的速度、稳定性和办公体验对比
linux·运维·服务器·后端·生成对抗网络
Java小白笔记15 小时前
Docker 安装配置完全指南:MacOS 、Windows、Linux环境下的安装、配置与验证
linux·macos·docker