找到文件后,我们经常要对结构化文本做字段提取、排序、去重和统计。下面用一份备份记录清单来练习:
crow@opsbox:~/work$ cp /srv/ops/practice/backup-list.csv .
crow@opsbox:~/work$ cat backup-list.csv
2026-06-28,library,12,ok
2026-06-28,portal,9,ok
2026-06-29,library,120,failed
2026-06-29,portal,10,ok
2026-06-30,library,13,ok
2026-06-30,portal,11,failed
2026-06-30,library,14,ok
每一行是一条备份记录,四个字段依次是:日期、服务名、文件大小(KiB)、状态。
提取单列并统计
先只看服务名这一列:
crow@opsbox:~/work$ cut -d ',' -f 2 backup-list.csv
library
portal
library
portal
library
portal
library
cut -d ',' -f 2:以逗号作为分隔符,提取第 2 个字段;- 再配合
sort和uniq,可以统计每个服务名出现了多少次:
crow@opsbox:~/work$ cut -d ',' -f 2 backup-list.csv | sort | uniq -c
4 library
3 portal
注意:uniq 只会合并相邻的重复行,所以在统计不重复项目之前,通常要先用 sort 排序。
按数值大小排序
如果要查看第 3 列,也就是文件大小:
crow@opsbox:~/work$ cut -d ',' -f 3 backup-list.csv | sort -n
9
10
11
12
13
14
120
普通的 sort 默认按文本字符排序,这会把 120 排到 2 之前。加上 -n,也就是 --numeric-sort,才是按数字大小排序。
用 awk 做条件筛选
如果想找出状态为 failed 的记录,并打印对应的日期、服务名和文件大小:
crow@opsbox:~/work$ awk -F ',' '$4 == "failed" {print $1, $2, $3}' backup-list.csv
2026-06-29 library 120
2026-06-30 portal 11
awk 很适合处理按列组织的数据:
-F ',':指定输入字段的分隔符是逗号;$4 == "failed":筛选条件,只处理第 4 列等于failed的行;{print $1, $2, $3}:输出动作,打印第 1、2、3 列。

