156 lines
2.8 KiB
Markdown
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` 适合格式化输出
|
|
- 它非常适合做日志分析、列提取和条件统计
|