三者常组合管道 | 串联使用,是日志分析、脚本处理核心工具。
逐行读取文本,匹配正则/普通字符串,输出命中行;只筛选,不修改原文。
| 参数 | 作用 |
|---|---|
| -i | 忽略大小写匹配 |
| -v | 反向匹配,输出不包含关键词的行 |
| -n | 输出匹配行的行号 |
| -c | 只统计匹配行数,不打印内容 |
| -o | 只打印匹配到的字符串本身,不打印整行 |
| -r / -R | 递归遍历目录下所有文件 |
| -l | 只输出包含匹配内容的文件名 |
| -A n | 匹配行 + 后n行 |
| -B n | 匹配行 + 前n行 |
| -C n | 匹配行 + 前后各n行 |
bash展开代码# 查找包含error的行
grep "error" app.log
# 忽略大小写查找
grep -i "error" app.log
bash展开代码# 过滤掉#开头注释、空行
grep -v "^#" nginx.conf | grep -v "^$"
bash展开代码# 写法1:find + xargs grep(兼容特殊文件名)
find /home/test -type f | xargs grep "test"
# 写法2:grep -r 简化递归
grep -r "test" /home/test/
# 只输出匹配的文件名称
grep -rl "test" /home/test/
bash展开代码# 打印error行及前后3行日志
grep -C 3 "error" app.log
bash展开代码grep -c "Exception" app.log
流式逐行处理文本,擅长行级操作,默认只输出到终端,不加 -i 不会修改原文件。
sed [参数] '定位+动作' 文件
-i:直接修改原文件;-i.bak 修改同时生成备份文件-n:只打印被p动作匹配的行,屏蔽默认全量输出bash展开代码# 全局替换每行所有www为blog(g=global全局)
sed 's/www/blog/g' test.txt
# 只修改第二处匹配,不加g只替换每行第一个
sed 's/www/blog/2' test.txt
# 直接修改原文件并备份test.txt.bak
sed -i.bak 's/127.0.0.1/192.168.1.100/g' hosts
# 匹配注释并取消注释(替换#开头空)
sed -i 's/^#port/port/g' nginx.conf
# 删除行首空格
sed 's/^ *//g' test.txt
bash展开代码# 删除空行
sed '/^$/d' test.txt
# 删除包含#注释的行
sed '/^#/d' nginx.conf
# 删除第5行
sed '5d' test.txt
# 删除10~20行区间
sed '10,20d' test.txt
# 删除匹配error的行
sed '/error/d' app.log
bash展开代码# 在第3行上方插入一行
sed '3i new_line' test.txt
# 在匹配hostname行下方追加内容
sed '/hostname/a server_name=test' test.txt
bash展开代码# 只输出包含root的行,等价grep
sed -n '/root/p' /etc/passwd
# 打印5-10行
sed -n '5,10p' test.txt
按分隔符切割文本为多列,擅长:字段筛选、数值运算、求和统计、格式化输出;处理日志、CSV、表格数据首选。
awk '条件{执行动作}' 文件
| 变量 | 含义 |
|---|---|
| $0 | 整行全部内容 |
| 2 $3... | 第1列、第2列、第3列字段 |
| NF | 当前行总列数 |
| NR | 当前行号 |
| FS | 输入分隔符,默认空格/制表符 |
| OFS | 输出分隔符 |
-F "分隔符":自定义字段分割符(逗号、冒号、/等)bash展开代码# /etc/passwd 冒号分隔,打印用户名($1)和shell($7)
awk -F: '{print $1,$7}' /etc/passwd
# 打印磁盘使用率第5列
df -h | awk '{print $5}'
# 多列格式化输出,自定义分隔符
df -h | awk '{print $1"|"$2"|"$5}'
bash展开代码# 只打印磁盘使用率超过80%的分区
df -h | awk 'NR>1 {gsub(/%/,"",$5);if($5>80) print $1,$5"%"}'
# 匹配包含root的行输出第1列
awk -F: '/root/ {print $1}' /etc/passwd
bash展开代码# 统计日志总访问量,累加第4列数字
awk '{sum+=$4} END{print "总流量:",sum}' access.log
# 统计文件行数(等价wc -l)
awk 'END{print NR}' test.txt
# 统计日志中200状态码行数
awk '$9==200 {count++} END{print count}' access.log
bash展开代码# 逗号分割csv文件
awk -F, '{print $2}' data.csv
# 输出用#分隔各列
awk -F: -v OFS="#" '{print $1,$3}' /etc/passwd
bash展开代码# 统计404报错数量
cat nginx.log | grep "404" | wc -l
# awk一步统计
awk '$9==404 {num++} END{print num}' nginx.log
bash展开代码cat nginx.conf | grep -v "^#" | grep -v "^$" | sed 's/localhost/192.168.1.10/'
bash展开代码netstat -tulnp | grep 80 | awk '{print $7}' | sed 's/\/.*//'
bash展开代码cat app.log | sed '/^$/d' | grep "WARN" | awk '{print $1,$5}'
grep 筛选行 → sed 修改内容 → awk 提取字段统计本文作者:zzz
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!