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`。
相关推荐
盐焗鹌鹑蛋1 小时前
【Linux】进程间通信与进程池
linux
无毁的湖光-Al2 小时前
解Bug之路-with AI-应用被限流?
java·linux
Brilliantwxx2 小时前
【Linux】 进程(4)七大进程状态深度解析
linux·运维·算法
HiDev_2 小时前
【非标自动化】2、认识元器件(气源处理组件)
运维·自动化
HiDev_2 小时前
【非标自动化】2、认识元器件(远程I/O)
运维·自动化
国际云,接待2 小时前
df 显示磁盘还有空间却无法写文件:Linux inode 耗尽排查与治理
linux·运维·服务器
HiDev_2 小时前
【非标自动化】2、认识元器件(运动控制模块)
运维·自动化
一路向北finish2 小时前
《CentOS 7 搭建 Hadoop 3.3.6 分布式集群:NFS 共享方案完整实操》
linux·运维·hadoop·分布式·centos
raindayinrain2 小时前
深入理解Linux内核--缺页异常,写时复制
linux·写时复制·缺页异常