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`。
相关推荐
朽棘不雕8 小时前
可执行程序的格式
linux
制冷技术咨询与服务9 小时前
纯电牵引车高压电源侧介绍
网络·汽车·纯电牵引车高压电源侧介绍
IT摆渡者9 小时前
11Panel 部署雷池WAF
linux
学习路上_write9 小时前
Linux黑马命令学习
linux·运维·服务器
那年窗外下的雪.9 小时前
AIDC 学习日志|第 22 天|All-Active/Single-Active 故障演练设计
服务器·网络·学习·算法·哈希算法
yunwei379 小时前
eBPF 教程:追踪 CUDA GPU 操作
linux·后端·性能优化
Android系统攻城狮9 小时前
Linux Gstreamer深度解析之gst_audio_channel_reorder_map调用流程与实战(十八)
linux·运维·服务器·音视频进阶·gstreamer音视频进阶
新时代牛马9 小时前
docker run 起不来?从dockerd、containerd 到runc 一条线讲透
运维·docker·容器
TomEval10 小时前
【App 自动化】14 - App 自动化基础与环境
运维·自动化
cc_yy_zh10 小时前
学习使用kali抓包
服务器·学习·php