wiki/运维/操作系统/Linux/笔记/16.文本awk.md
2026-04-08 15:02:24 +08:00

156 lines
2.8 KiB
Markdown

## 1、`awk` 概览
`awk` 是 Linux 中非常强大的文本分析工具,特别适合处理**按列分隔**的数据。
常见用途:
- 提取某几列字段
- 按条件筛选内容
- 统计求和
- 格式化输出
- 分析日志和表格类文本
## 2、工作流程
`awk` 的处理流程通常是:
1. 先执行 `BEGIN` 语句块
2. 逐行读取输入
3. 对每一行执行 `pattern { action }`
4. 最后执行 `END` 语句块
基本格式:
```shell
awk 'BEGIN{action} pattern{action} END{action}' file
```
## 3、字段分隔符
### 3.1 `-F`
用于指定输入字段分隔符。
```shell
awk -F: '{print $1}' /etc/passwd
```
这里的 `:` 表示按冒号分列。
### 3.2 内置变量 `FS`
`FS` 表示输入字段分隔符,功能类似 `-F`
```shell
awk 'BEGIN{FS=":"} {print $1}' /etc/passwd
```
## 4、常用变量
- `FS`:输入字段分隔符
- `OFS`:输出字段分隔符
- `NF`:当前行字段数
- `NR`:当前处理到第几行
- `$1``$2`:第 1 列、第 2 列
- `$0`:整行内容
### 4.1 自定义变量
可以使用 `-v` 定义变量:
```shell
awk -v threshold=100 '$3 > threshold {print $0}' file.txt
```
## 5、常见动作
### 5.1 `print`
用于简单输出。
```shell
awk -F: '{print $1,$3}' /etc/passwd
```
- 逗号表示按输出分隔符拼接
- 字符串要用引号包裹
### 5.2 `printf`
用于格式化输出。
```shell
awk -F: '{printf "user=%s uid=%s\n", $1, $3}' /etc/passwd
```
常见格式符:
- `%s`:字符串
- `%d`:整数
- `%f`:浮点数
- `%e`:科学计数法
- `%c`:字符
- `%u`:无符号整数
注意:`printf` **不会自动换行**,通常要手动加 `\n`
## 6、流程控制
`awk` 支持常见控制语句:
- `if`
- `if ... else`
- `while`
- `for`
- `break`
- `continue`
- `exit`
### 6.1 条件筛选示例
```shell
awk -F: '$3 >= 1000 {print $1,$3}' /etc/passwd
```
表示打印 UID 大于等于 1000 的用户。
## 7、常见示例
### 7.1 提取第一列
```shell
awk '{print $1}' file.txt
```
### 7.2 打印行号和内容
```shell
awk '{print NR, $0}' file.txt
```
### 7.3 统计某列总和
```shell
awk '{sum += $1} END {print sum}' numbers.txt
```
### 7.4 格式化输出 `/etc/passwd`
```shell
awk -F: '{printf "user=%-15s uid=%s\n", $1, $3}' /etc/passwd
```
## 8、实战建议
- 按列处理文本时优先考虑 `awk`
- 做简单列提取时,`cut` 更轻;做条件判断和计算时,`awk` 更强
- 处理日志、表格、监控数据时,`awk` 非常高频
- 写复杂语句时,先从简单 `print` 版本调试,再逐步增强
## 9、小结
- `awk` 是按行读、按列处理的强力文本工具
- `-F``FS``NR``NF``$1``$0` 是最常见概念
- `print` 适合简单输出,`printf` 适合格式化输出
- 它非常适合做日志分析、列提取和条件统计