Linux三剑客 grep sed awk 小白基础教程

文章目录

  • [Linux三剑客 grep sed awk 小白基础教程](#Linux三剑客 grep sed awk 小白基础教程)
    • [一、grep 文本过滤(抓行)](#一、grep 文本过滤(抓行))
    • [二、sed 流编辑器(增、删、改、替换)](#二、sed 流编辑器(增、删、改、替换))
    • [三、awk 处理列,切片、条件、统计(重点)](#三、awk 处理列,切片、条件、统计(重点))
    • [四、三剑客组合实战(管道 `|`,面试高频)](#四、三剑客组合实战(管道 |,面试高频))
    • 五、记忆总结

Linux三剑客 grep sed awk 小白基础教程

📌分工速记,一定要记住三者定位:

  • grep:过滤行,搜索,抓想要的行(只筛选,不改内容)
  • sed:行编辑器,增删改替换(处理一整行文本)
  • awk:处理列,切片、判断、统计、计算(切割字段,类似Excel列操作)

准备测试文本,新建test.txt,下面全部示例都用这个文件做练习:

复制代码
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
nginx:x:997:995:Nginx user:/var/lib/nginx:/sbin/nologin

一、grep 文本过滤(抓行)

作用:根据关键词/正则,筛选出符合条件的行;类似Windows的Ctrl+F查找。 语法:grep [选项] "关键词" 文件名

常用选项

选项 作用
-i 忽略大小写匹配
-v 反向匹配,输出不匹配关键词的行
-n 显示匹配内容的行号
-o 只打印匹配到的字符串,不输出整行
-E 开启扩展正则表达式,等价命令egrep

实操示例

复制代码
# 匹配包含root的所有行
grep "root" test.txt

# 输出不包含nologin的行(反向过滤)
grep -v "nologin" test.txt

# 忽略大小写,同时显示行号
grep -in "mysql" test.txt

# 扩展正则,匹配包含root 或者 nginx 的行
grep -E "root|nginx" test.txt

💡面试高频:过滤配置文件,去掉#注释行

复制代码
grep -v "^#" /etc/fstab

二、sed 流编辑器(增、删、改、替换)

⚠️重要提醒:sed默认只会屏幕输出预览,不会改动磁盘原文件;必须加 -i 参数才会真正修改文件! 语法:sed [选项] '指令' 文件名

核心指令

指令 含义
s/// 字符串替换(最常用)
d 删除行
a 在目标行下方追加新行
i 在目标行上方插入新行

常用选项

选项 作用
-n 静默模式,只输出被匹配处理过的行
-i 直接修改原文件(生产环境谨慎使用)
-i.bak 修改同时自动备份原文件为xxx.bak,强烈推荐生产使用
-r / -E 开启扩展正则表达式

实操示例

复制代码
# 替换:每行第一个root替换为admin,仅屏幕预览,不改原文件
sed 's/root/admin/' test.txt

# g代表global全局,把每行所有nologin替换成false,全部替换
sed 's/nologin/false/g' test.txt

# 删除包含nginx的行(预览,原文件不变)
sed '/nginx/d' test.txt

# 在第2行的下面追加一行文字
sed '2a hello world' test.txt

# 在第2行的上面插入一行文字
sed '2i new line' test.txt

# 真正修改磁盘文件,同时备份原文件 test.txt.bak
sed -i.bak 's/nologin/false/g' test.txt

# -n + p 只打印文件第2~3行内容
sed -n '2,3p' test.txt

🧠思考练习题:使用sed修改selinux配置,设置为disabled

三、awk 处理列,切片、条件、统计(重点)

擅长:按分隔符把一行切成多列,提取字段、做条件判断、数值统计,处理/etc/passwd这类冒号分隔的文本、日志非常好用。 语法:awk '条件{动作}' 文件名

✨必背内置变量

变量 含义
$0 代表整行全部内容
$1 $2 ... 第1列、第2列......
NF 当前行总列数;$NF代表最后一列
NR 当前行的行号
FS 输入分隔符,默认以空格分割;-F:等价于设置FS为冒号
OFS 输出分隔符

实操示例(test.txt是冒号分隔,用 -F: 指定分隔符)

复制代码
# 打印第1列(用户名)、第7列(shell解释器)
awk -F: '{print $1,$7}' test.txt

# 打印每一行的最后一列
awk -F: '{print $NF}' test.txt

# 打印行号 + 第一列
awk -F: '{print NR,$1}' test.txt

# 条件判断:第3列UID大于100,打印对应用户名
awk -F: '$3>100 {print $1}' test.txt

# 匹配包含root的行,打印该行第一列
awk -F: '/root/ {print $1}' test.txt

系统真实场景示例(df磁盘查看)

复制代码
# 读取df -h输出,打印第一列磁盘设备、第五列使用率
df -h | awk '{print $1,$5}'

四、三剑客组合实战(管道 |,面试高频)

管道符|:把前面命令输出结果,交给后面的命令继续处理。

复制代码
# 1. 过滤包含nologin的行,再提取第一列用户名
grep "nologin" test.txt | awk -F: '{print $1}'

# 2. 过滤配置文件,去掉注释行(#开头)和空行
grep -vE '^#|^$' /etc/profile

# 3. 文件中所有/bin/bash替换为/bin/sh,修改前自动备份
sed -i.bak 's/\/bin\/bash/\/bin\/sh/g' test.txt

五、记忆总结

  1. grep:拿行、过滤、搜索 ,擅长找内容,不擅长修改文本。
  2. sed:处理整行 ,替换/删除/新增文本;-i才会改原文件,优先用‑i.bak备份。
  3. awk:拆分列,做判断统计 ,重点记住 $1 $NF NR NF。

.txt

复制代码
## 五、记忆总结

1. **grep:拿行、过滤、搜索**,擅长找内容,**不擅长修改文本**。
2. **sed:处理整行**,替换/删除/新增文本;`-i`才会改原文件,优先用`‑i.bak`备份。
3. **awk:拆分列,做判断统计**,重点记住 `$1 $NF NR NF`。
相关推荐
by2099911 分钟前
Linux 基础指令与文件操作
linux·1024程序员节
砺星Leetx28 分钟前
工业总线选型与对接实战:PROFINET、EtherCAT、EtherNet/IP、PROFIBUS、Modbus-TCP 与 CC-Link
网络·网络协议·tcp/ip·控制器·国产拧紧系统
2401_8685347834 分钟前
软考网络规划设计师SSL协议知识点详解
服务器·网络
Escalating_xu1 小时前
【Linux 网络编程】手写序列化与反序列化:从 x op y 到能校验的文本协议
linux·运维·网络
润滑卫士1 小时前
油液多参数融合故障诊断:数据级融合与决策级融合方法
运维
李纲明2 小时前
WordPress 后台登录马上被踢回登录页:Cookie 域、HTTPS、盐值和页面缓存怎么查
运维·缓存·https·php·wordpress·cookie
todoitbo2 小时前
在 Ubuntu ARM64 上运行 Q1 V3.0 MuJoCo 模型:加载、步进和单执行器响应
linux·运维·ubuntu·ai·机器人·仿真教程·启元
AR-26710-3 小时前
Linux Day26——传输层与三次握手
linux·运维
POMAGTOR3 小时前
【磁吸式连接器选型工程解析:结构原理、应用场景与选型可靠性要点】
网络·嵌入式硬件
隔窗听雨眠4 小时前
PostgreSQL单表从Windows迁移到Linux:差异剖析、方案对比与全流程实战
linux·windows·postgresql