1. 三剑客简介与区别
| 工具 | 核心作用 | 记忆口诀 | 适用场景 |
|---|
| grep | 过滤 | 过滤查找 | 快速查找包含特定字符串或符合正则的行。 |
| sed | 修改/替换 | 取行、修改 | 文本文件的增删改查,特别是批量替换。 |
| awk | 取列/统计 | 取列、计算 | 格式化输出,处理结构化数据(如日志、CSV)。 |
2. grep:文本过滤专家
作用:模糊过滤文件内容,类似于“查找”。
就i
2.1 常用参数详解
| 参数 | 含义 | 备注 |
|---|
-v | 取反 | 排除匹配的行 (Invert match)。 |
-r | 递归 | 过滤目录及子目录下所有文件的内容。 |
-i | 忽略大小写 | 不区分大小写匹配 (Ignore case)。 |
-w | 精确匹配 | 按单词匹配,避免匹配到子串 (Word)。 |
-o | 仅显示匹配过程 | 只输出匹配到的部分,而不是整行。 |
-E | 支持扩展正则 | 等同于 egrep,支持 +, ?, |, () 等。 |
-n | 显示行号 | 输出匹配行的行号 (Line number)。 |
-c | 统计次数 | 统计匹配到的行数 (Count)。 |
-A n | After | 显示匹配行及其后 n 行。 |
-B n | Before | 显示匹配行及其前 n 行。 |
-C n | Context | 显示匹配行及其前后各 n 行。 |
2.2 实战案例
- 递归查找:查找当前目录及子目录下所有包含 "www.baidu.com" 的文件。
bash grep -r 'www.baidu.com' . # 或者配合 find 使用 find ./ -type f | xargs grep 'www.baidu.com'
- 统计出现次数:统计日志中出现 "Failed" 的总次数。
bash grep -c "Failed" /var/log/secure
3. sed:流编辑器 (Stream Editor)
作用:主要用于对文件进行增、删、改、查,特别是按行处理和文本替换。
3.1 核心语法
sed [选项] '模式 动作' 文件
sed [选项] '找谁 干啥' 文件
- 常用选项:
-n: 取消默认输出(默认 sed 会输出所有行,配合 p 动作使用)。
-i: 直接修改源文件 (Dangerous! 慎用)。
-r: 支持扩展正则表达式。
3.2 常见动作 (Action)
| 动作 | 含义 | 示例 |
|---|
p | 打印 (Print) | sed -n '3p' (打印第3行) |
d | 删除 (Delete) | sed '3d' (删除第3行) |
s | 替换 (Substitute) | sed 's#old#new#g' (替换) |
i | 插入 (Insert) | sed '3i content' (在第3行前插入) |
a | 追加 (Append) | sed '3a content' (在第3行后追加) |
c | 整行替换 (Change) | sed '3c content' (将第3行整行替换) |
w | 保存 (Write) | sed '3w new.txt' (将第3行写入新文件) |
3.3 实战案例
3.3.1 查找 (p)
- 指定行:
sed -n '3p' file (第3行), sed -n '2,4p' file (第2到4行)。
- 正则过滤:
sed -n '/root/p' file (包含root的行)。
- 区间过滤:
sed -n '/start/,/end/p' file (匹配从 start 到 end 之间的所有行,常用于按时间截取日志)。
3.3.2 删除 (d)
- 删除行:
sed '3d' file (删第3行), sed '2,$d' file (删第2行到最后)。
- 过滤删除:
sed '/root/d' file (删除包含root的行)。
- 排除空行和注释:
sed -r '/^$|^#/d' config_file。
3.3.3 替换 (s)
- 基本格式:
sed 's#原内容#新内容#g' (g 代表全局替换,否则只替第一个)。
- 后向引用 (高级):使用
() 分组,用 \1, \2 引用。
- 案例:提取网卡IP
bash ifconfig eth0 | sed -n '2p' | sed -r 's#^.*t (.*) netm.*$#\1#g'
- 案例:批量生成用户命令
bash echo test{1..3} | xargs -n1 | sed -r 's#(.*)#useradd \1#g' | bash
4. awk:文本分析工具
作用:一门编程语言,擅长取列、格式化输出、统计计算。
4.1 核心语法
awk [选项] '模式 {动作}' 文件
- 默认行为:如果不写动作,默认输出整行。
- 常用选项:
-F: 指定分隔符(默认为空格或Tab)。支持多分隔符,如 -F "[:/]+"。
4.2 内置变量
| 变量 | 含义 |
|---|
$0 | 整行内容。 |
$1 … $n | 第1列 … 第n列。 |
NF | 最后一列的列号 (Number of Fields)。 |
$NF | 最后一列的内容。 |
$(NF-1) | 倒数第二列。 |
NR | 行号 (Number of Records)。 |
4.3 实战案例
4.3.1 取行 (NR)
- 指定行:
awk 'NR==3' file (第3行)。
- 范围:
awk 'NR>2 && NR<5' file (第3到4行)。
- 逻辑运算:
&& (并且), || (或者), != (不等于)。
4.3.2 取列 ($n)
- 指定列:
awk '{print $1, $3}' file (打印第1和第3列)。
- 指定分隔符:
bash awk -F: '{print $1, $NF}' /etc/passwd
- 自定义输出:
awk '{print $1 "----" $3}' file (拼接字符串)。
4.3.3 模式匹配 (正则 & 比较)
- 正则匹配:
awk '/root/' file (整行包含root)。
awk '$2 ~ /^o/' file (第2列以 'o' 开头)。
- 数值比较:
awk '$3 > 500' file (第3列数值大于500)。
- 案例:统计成绩
bash # 统计分数在80到90之间的人数 awk '$2>=80 && $2<90' scores.txt | wc -l
4.3.4 混合实战
- 提取磁盘利用率:
bash df -h | awk '/\/$/{print $5}' # 匹配以 / 结尾的行,打印第5列
5. 总结
| 功能 | 命令选择 | 示例 |
|---|
| 找文件内容 | grep | grep "error" log.txt |
| 替换文件内容 | sed | sed -i 's#A#B#g' file |
| 取某一列 | awk | awk '{print $1}' file |
| 取某一行 | sed / awk | sed -n '5p' 或 awk 'NR==5' |
| 范围截取 | sed | sed -n '/Start/,/End/p' file |
学习建议:
- 正则(Regular Expression)是三剑客的灵魂,务必熟练掌握。
grep 用得最多,sed 适合脚本修改配置,awk 适合数据分析和报表。
Comments 1 条评论
awk '$2 ~ /^o/' file,当中的~表示匹配运算符,该命令表示取文件的第二列出来匹配以o开头的内容