CodeGym /课程 /Docker SELF /使用 `awk` 格式化数据

使用 `awk` 格式化数据

Docker SELF
第 8 级 , 课程 2
可用

使用 awk 格式化数据

1. 初识 awk

awk 是一个强大的文本处理工具。如果把文本文件看作一张表格,其中行就是行(很直观),而列是用空格分隔的数据,那么 awk 就会成为我们的好朋友。它可以帮我们快速选择列、筛选行、格式化数据,甚至执行算术操作。

它的名字来源于它的作者们 —— Alfred Aho、Peter Weinberger 和 Brian Kernighan(对,就是参与创建 C 语言的那位)。

awk 的核心概念是使用模式和动作来处理数据,这让它有点像一种迷你编程语言。

awk 的语法

命令的基本语法如下:

awk '模式 {动作}' 文件
  • 模式 —— 针对文件中每一行检查的条件。
  • 动作 —— 针对符合模式的行执行的操作。
  • 如果没有模式,动作会对每一行执行。

例子:

awk '{print $1}' data.txt

这条命令会打印文件 data.txt 中每一行的第一列 ($1)。


2. awk的主要功能

1. 选择列

使用awk最简单的方法就是从文件中选择一个或多个列。字段用$n表示,其中n是列号,从1开始。

示例:

输出第一列和第三列:

awk '{print $1, $3}' data.txt

假设文件data.txt内容如下:

John 25 Engineer
Jane 30 Designer
Mike 28 Developer

结果:

John Engineer
Jane Designer
Mike Developer

2. 条件处理行

条件允许仅处理满足特定条件的行。

示例:

输出第二列大于27的行:

awk '$2 > 27 {print $1, $2}' data.txt

结果:

Jane 30
Mike 28

3. 算术操作

awk可以执行算术操作。当你需要实时计算一些内容时,这非常有用。

示例:

将第二列的值加10:

awk '{print $1, $2+10}' data.txt

结果:

John 35
Jane 40
Mike 38

4. 统计行数

awk会自动知道处理了多少行。这些信息存储在变量NR(Number of Records)中。

示例:

统计文件中的行数:

awk 'END {print NR}' data.txt

结果:

3

3. 扩展功能

1. 格式化输出

awk支持强大的格式化输出,可以使用printf函数。这类似于C语言中的printf函数。

例子:

对齐输出数据:

awk '{printf "%-10s %-5s %-10s\n", $1, $2, $3}' data.txt

结果:

John       25    Engineer  
Jane       30    Designer  
Mike       28    Developer 

2. 变量

你可以使用变量来存储数据并简化操作。

例子:

计算第二列的总和:

awk '{sum += $2} END {print "总年龄:", sum}' data.txt

结果:

总年龄: 83

3. 正则表达式

awk支持使用正则表达式来查找字符串。

例子:

输出第一列中包含字母J的行:

awk '/J/ {print $0}' data.txt

结果:

John 25 Engineer
Jane 30 Designer

4. 实践示例

1. 分析系统日志

假设我们有一个系统日志文件 /var/log/syslog,我们想知道哪些进程最常被提到。

命令:

cat /var/log/syslog | awk '{print $5}' | sort | uniq -c | sort -nr | head -10

这段命令做了什么:

  1. cat /var/log/syslog — 读取文件内容。
  2. awk '{print $5}' — 提取第五列(进程名)。
  3. sort — 按字母顺序排序。
  4. uniq -c — 统计唯一行的数量。
  5. sort -nr — 按数值从大到小排序。
  6. head -10 — 输出前10个进程。

2. 准备工资报告

我们有一个文件 salaries.txt

John 25 4000
Jane 30 5000
Mike 28 4500

任务:

将工资增加10%,并显示最终报告。

解决方案:

awk '{new_salary = $3 * 1.1; printf "%-10s %-5s %-10.2f\n", $1, $2, new_salary}' salaries.txt

结果:

John       25    4400.00
Jane       30    5500.00
Mike       28    4950.00

5. 使用awk时常见的错误

分隔符的问题

默认情况下,awk使用空格或制表符作为分隔符。如果你的数据是用其他东西(比如逗号或冒号)分隔的,就需要用-F选项指定。

例子:

文件data.csv:

John,25,Engineer
Jane,30,Designer
Mike,28,Developer

处理CSV的命令:

awk -F',' '{print $1, $3}' data.csv

结果:

John Engineer
Jane Designer
Mike Developer

因为格式问题丢失字段

有时候行可能会包含意外的空格或缺失的列。这可能会导致错误。在开始之前总是检查一下你的数据会更好。

实际应用

你刚刚学会了如何使用awk来分析系统日志、处理薪资数据并制作报告。这些技能会帮助你处理大型数据库、CSV文件以及实际项目中的日志。如果你是DevOps工程师,用awk分析系统日志将会是你的超级能力。如果你是开发者,这也是从终端中快速操作数据的好方法。

要更深入地学习awk,建议查看GNU Awk官方文档。现在你完全知道如何让你的数据更听话了!

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION