📜 三剑客能力对比表

工具

核心能力

擅长场景

复杂度

执行速度

grep

搜索过滤

快速查找匹配模式的行

★★☆☆

极快

sed

流编辑

批量替换/删除/插入文本

★★★☆

awk

文本分析

结构化数据提取/统计/报表

★★★★

较快

🔍 第一剑:grep- 文本搜索专家

核心功能

在文件中快速查找包含特定模式(正则表达式)的行

常用选项速查

选项

作用

示例

-i

忽略大小写

grep -i "error" log.txt

-v

反向匹配(显示不匹配的行)

grep -v "success" log.txt

-n

显示行号

grep -n "warning" log.txt

-r

递归目录搜索

grep -r "function" /src/

-A 3

显示匹配行及后3行

grep -A 3 "crash" log.txt

-B 2

显示匹配行及前2行

grep -B 2 "start" log.txt

-C 1

显示匹配行及前后1行

grep -C 1 "critical" log.txt

# 查找包含"error"的所有行(区分大小写)
grep "error" /var/log/syslog

# 忽略大小写查找"mysql"相关行并显示行号
grep -in "mysql" /var/log/syslog

# 查找所有以"127.0.0.1"开头的行
grep "^127.0.0.1" /etc/hosts

# 统计包含"GET"的请求次数(结合wc)
grep "GET" access.log | wc -l

# 查找所有.py文件中的"import numpy"
find . -name "*.py" | xargs grep "import numpy"

高级技巧

使用-E和-O

选项

作用

示例

-E

使用正则匹配

grep -E "error|warn" log.txt

-o

显示匹配内容

grep -Eo ls .bash_history

# 使用扩展正则表达式(支持+、?、|等)
grep -E "error|warning" log.txt

# 只显示匹配的部分(而非整行)
grep -o "user_[0-9]\+" log.txt

# 查找IP地址(更精确的正则)
grep -Eo "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" log.txt

✂️ 第二剑:sed- 流编辑器

核心功能

对文本进行非交互式编辑​(替换、删除、插入等)

常用命令格式

sed 's/原内容/新内容/[选项]' 文件

核心操作符

命令

作用

示例

s

替换

sed 's/old/new/' file

d

删除行

sed '/pattern/d' file

p

打印行

sed -n '/pattern/p' file

i

行前插入

sed '3i\插入内容' file

a

行后追加

sed '/pattern/a\追加内容' file

📊第三剑:awk- 文本分析大

核心功能

基于字段的文本处理和数据统计(特别适合表格数据)

基本结构

awk '模式 {动作}' 文件

内置变量

变量

含义

示例

$0

整行内容

awk '{print $0}' file

$1

第一个字段

awk '{print $1}' file

NF

字段数量

awk '{print NF}' file

NR

当前行号

awk '{print NR}' file

FS

输入字段分隔符

awk -F: '{print $1}' /etc/passwd

OFS

输出字段分隔符

awk -F: 'OFS="-" {print $1,$3}' /etc/passwd

特殊模式 BEGINEND​:

BEGIN{}:在处理任何输入行之前执行一次,常用于初始化变量、打印表头或设置分隔符。

END{}:在处理完所有输入行之后执行一次,常用于输出汇总信息或最终结果。

awk 'BEGIN {print "Processing started"; sum=0} {sum += $1} END {print "Total sum:", sum}' data.txt

举例

# 打印/etc/passwd的用户名(第1列)
awk -F: '{print $1}' /etc/passwd

# 打印文件的第一列和最后一列
awk '{print $1, $NF}' data.txt

# 统计文件行数
awk 'END {print NR}' file.txt

# 计算第二列的总和
awk '{sum+=$2} END {print sum}' data.txt

# 过滤出第三列大于100的行
awk '$3 > 100 {print $0}' data.csv

# 按IP统计访问次数(假设第一列是IP)
awk '{ip_count[$1]++} END {for(ip in ip_count) print ip, ip_count[ip]}' access.log

高级用法