在 Linux 运维中,文本处理是最常见的需求:
而 grep
、sed
、awk
就是三把利器:
掌握它们,你的运维效率会提升 N 倍!
在开始之前,请先在主服务器上创建一个示例目录,并准备一份测试文本:
# 登录到 master
ssh dba@master.example.com
# 创建工作目录
mkdir-p ~/dba-scripts/three-musketeers
cd ~/dba-scripts/three-musketeers
# 创建示例日志文件
cat> sample.log <<'EOF'
2025-05-24 10:00:01 INFO Starting MySQL master
2025-05-24 10:05:12 WARN Connection slow from 192.168.1.10
2025-05-24 10:10:45 ERROR Failed to replicate to slave1
2025-05-24 10:15:33 INFO Cleaning up old backups
EOF
然后,务必检查三剑客命令是否可用:
forcmdingrepsedawk;do
command-v$cmd>/dev/null >&1
if[$?-ne];then
echo"错误:未检测到命令 $cmd,安装请执行 -> sudo dnf install -y $cmd"
exit
fi
done
echo"✅ grep、sed、awk 均已安装,可开始学习!"
如果看到
bash: grep: 未找到命令
,就按提示安装;安装后重新登录或者执行source ~/.bash_profile
。
grep"ERROR" sample.log
解释
忽略大小写
# 查找所有含 error(不区分大小写),并显示行号
grep-in"error" sample.log
假设日志按时间顺序记录,想要筛出最近一小时(60 分钟)内的 ERROR:
# 计算 60 分钟前的时间戳
START_TIME=$(date-d'1 hour ago' +"%Y-%m-%d %H:%M")
grep"${START_TIME::13}" sample.log |grep"ERROR"
若命令报
date: invalid date
,请确认服务器时区与当前时间一致(timedatectl
查看/修改)。
# 将所有 WARN 替换为 WARNING,直接在终端输出
sed's/WARN/WARNING/g' sample.log
s/old/new/g
:替换所有匹配
# 先备份,再批量替换
cp sample.log sample.log.bak
sed-i's/WARN/WARNING/g' sample.log
-i
:原地编辑-i ''
或 -i.bak
将每行前面加上当前日期时间戳:
sed-i"s|^|$(date +"[%F %T] ")|" sample.log
^
表示行首"$(date ...)"
嵌入 Shell 命令如果报
sed: -e expression #1, char 1: unknown command:
,请检查引号是否匹配,尽量用双引号包裹变量。
# 打印第 2 列(日志级别)和第 3 列(消息)
awk'{print $2, $3}' sample.log
# 只显示 ERROR 级别的行,并打印行号与消息
awk'$2=="ERROR" {print NR, $0}' sample.log
$2=="ERROR"
:第二列等于 ERRORNR
:当前行号$0
:整行内容
awk'{count[$2]++} END {for(level in count) print level, count[level]}' sample.log
count
统计END
块中输出结果输出示例:
INFO
WARNING
ERROR
如果出现
awk: cmd. line:1: syntax error
,请确认使用的是gawk
或mawk
(系统自带一般是 gawk)。
举例:先找出 ERROR 行,再替换关键字,最后统计出现次数:
grep"ERROR" sample.log \
|sed's/ERROR/CRITICAL/g'\
|awk'{count[$2]++} END{print "CRITICAL count:", count["CRITICAL"]}'
这样,你一次流水线操作就完成了复杂任务。
- grep 未安装:sudo dnf install -y grep- PATH 环境缺少 /usr/bin