文章目录
- [Linux三剑客 grep sed awk 小白基础教程](#Linux三剑客 grep sed awk 小白基础教程)
-
- [一、grep 文本过滤(抓行)](#一、grep 文本过滤(抓行))
- [二、sed 流编辑器(增、删、改、替换)](#二、sed 流编辑器(增、删、改、替换))
- [三、awk 处理列,切片、条件、统计(重点)](#三、awk 处理列,切片、条件、统计(重点))
-
- ✨必背内置变量
- [实操示例(test.txt是冒号分隔,用 `-F:` 指定分隔符)](#实操示例(test.txt是冒号分隔,用
-F:指定分隔符)) - 系统真实场景示例(df磁盘查看)
- [四、三剑客组合实战(管道 `|`,面试高频)](#四、三剑客组合实战(管道
|,面试高频)) - 五、记忆总结
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
五、记忆总结
- grep:拿行、过滤、搜索 ,擅长找内容,不擅长修改文本。
- sed:处理整行 ,替换/删除/新增文本;
-i才会改原文件,优先用‑i.bak备份。 - awk:拆分列,做判断统计 ,重点记住
$1 $NF NR NF。
.txt
## 五、记忆总结
1. **grep:拿行、过滤、搜索**,擅长找内容,**不擅长修改文本**。
2. **sed:处理整行**,替换/删除/新增文本;`-i`才会改原文件,优先用`‑i.bak`备份。
3. **awk:拆分列,做判断统计**,重点记住 `$1 $NF NR NF`。