sed/awd入门------一个结合真实日志/CSV 的实操练习集

先建一份模拟日志和一份 CSV,然后用 sed/awk 逐个练。所有命令我在本地验证过逻辑,你在机器上照抄就能跑。

第一步:准备练习数据

直接复制这两段到终端执行,会生成 app.log 和 users.csv 两个文件。

cat > app.log <<'EOF'
2026-08-26 10:01:23 ERROR Database connection timeout host=db1
2026-08-26 10:02:11 INFO  User login ok userid=1001
2026-08-26 10:03:45 WARN  Disk usage 90% on /data
2026-08-26 10:05:02 ERROR Api /v1/order timeout host=api1
2026-08-26 10:06:30 INFO  User login ok userid=1002
2026-08-26 10:08:12 ERROR Database connection timeout host=db2
2026-08-26 10:09:00 WARN  Memory usage 85% host=web1
2026-08-26 10:10:55 INFO  Cron job finished ok job=backup
EOF

cat > users.csv <<'EOF'
id,name,dept,salary
1,zhang,dev,15000
2,li,ops,12000
3,wang,dev,18000
4,zhao,hr,10000
5,qian,ops,13000
6,sun,dev,20000
EOF

如果你在 Windows 用 Git Bash / WSL,或 Linux/macOS 终端,上面都能跑。


第二组:sed 练习(改内容)

练 1 — 把所有 timeout 改成 timed_out(不落盘预览)

sed 's/timeout/timed_out/g' app.log | head -3

练 2 — 只把 ERROR 行里的 ERROR 改成 **ERROR**(条件替换)

sed '/ERROR/s/ERROR/**ERROR**/' app.log

练 3 — 删掉所有 WARN 行

sed '/WARN/d' app.log

练 4 — 只保留 2~4 行

sed -n '2,4p' app.log

练 5 — 第 1 列日期去掉 -(真正改文件用 -i)

sed -i 's/2026-08-26/20260826/' app.log
# 预览效果,之后想还原:
# sed -i 's/20260826/2026-08-26/' app.log

★ 综合题:把 users.csv 表头 name 改成 fullname 并落盘:

sed -i '1s/name/fullname/' users.csv && head -2 users.csv

第三组:awk 练习(取数据 / 算数据)

练 6 — 打印日志的时间 + 级别 + 主机

awk '{print $2, $3}' app.log

(第 2 列是时间,第 3 列是级别。)

练 7 — 只统计有多少条 ERROR

awk '/ERROR/{count++} END{print "ERROR count:", count}' app.log

练 8 — 按级别统计条数(统计 + 数组)

awk '{c[$3]++} END{for (k in c) print k, c[k]}' app.log

练 9 — CSV 按部门算平均工资

awk -F',' 'NR>1 {sum[$3]+=$4; n[$3]++} END{for(d in sum) printf "%s 平均=%.0f\n", d, sum[d]/n[d]}' users.csv

练 10 — 找出工资最高的员工

awk -F',' 'NR>1 && $4>max {max=$4; name=$2} END{print name, max}' users.csv

★ 综合题:统计每个部门的员工数和工资总和:

awk -F',' 'NR>1 {c[$3]++; s[$3]+=$4} END{for(d in c) printf "%s 人数=%d 总额=%d\n", d, c[d], s[d]}' users.csv

第四组:sed + awk 组合实战(真实场景最常用)

练 11 — 先 sed 清洗,再 awk 统计(管道)
统计日志里「数据库连接超时」出现几次:

sed 's/^[0-9-]*//; s/ [0-9:]*//' app.log | awk '/Database/{c++} END{print c}'

练 12 — 提取 CSV 前 3 个部门的 ID 列(取列 + 去表头)

awk -F',' 'NR>1 && NR<=4 {print $1, $3}' users.csv

参考答案(做完整理核对用)

题 期望输出要点
7 ERROR count: 3
8 ERROR 3 WARN 2 INFO 3(顺序不定)
9 dev≈17667 ops≈12500 hr=10000
10 sun 20000
★综合 dev 人数3 总额53000;ops 2 25000;hr 1 10000
11 3

建议节奏:先过练 1–5(sed),再 6–10(awk),最后 11–12 组合。每道命令跑完用 cat 或 head 看输出,对照参考答案验证。

练的过程中卡在哪一条、或者输出和预期不符,把命令和输出贴我,我帮你定位。练熟之后如果你愿意,我还可以给你一版「按真实 Nginx 访问日志」的进阶题(IP 统计、Top N、状态码聚合那种)。

posted @ 2026-08-26 12:07  菜就多练forever  阅读(13)  评论(0)    收藏  举报