### awk 是什么？

`awk` 是 Linux/Unix 下非常强大的**文本处理工具**，名字来源于三位作者的姓氏首字母（Aho、Weinberger、Kernighan）。
它特别适合**按列处理文本数据**，可以快速实现筛选、分隔、计算、格式化输出等功能。常用于处理日志、数据统计、批量格式转换。

---

### 基本原理

* **逐行读取文件**，自动按“空格”或指定分隔符，把每一行分成若干列（字段）。
* 每一列用 `$1`, `$2`, ... `$n` 表示，`$0` 表示整行。
* 可以直接用表达式、条件、格式输出，非常灵活。

---

### 常用用法

#### 1. 按列打印

```bash
awk '{print $1}' file.txt
```

**效果**：输出 file.txt 每一行的第1列内容。

---

#### 2. 指定分隔符（如逗号）

```bash
awk -F ',' '{print $2}' data.csv
```

**效果**：把逗号当分隔符，输出第2列。

---

#### 3. 条件筛选（如第3列大于100的行）

```bash
awk '$3 > 100 {print $0}' file.txt
```

**效果**：只输出第3列数值大于100的整行内容。

---

#### 4. 多列格式输出

```bash
awk '{print $2, $4}' data.txt
```

**效果**：输出每行的第2列和第4列，空格分隔。

---

#### 5. 列计算与统计

```bash
awk '{sum += $2} END {print sum}' sales.txt
```

**效果**：统计所有行第2列的总和，常用于做汇总。

---

### 日常场景举例

* 查看日志的指定字段（如时间/ip等）

  ```bash
  awk '{print $1, $3}' access.log
  ```
* 批量提取 CSV 文件某一列

  ```bash
  awk -F ',' '{print $4}' data.csv
  ```
* 条件过滤（如只要金额大于1000的行）

  ```bash
  awk '$5 > 1000 {print $0}' order.txt
  ```

---

### 常用参数/表达式说明

| 表达式        | 作用说明                     |
| ---------- | ------------------------ |
| \$1、\$2... | 当前行的第1、2、...列            |
| \$0        | 当前行的全部内容                 |
| -F 分隔符     | 指定分隔符（如 -F ','）          |
| NR         | 行号（Number of Record）     |
| NF         | 当前行的列数（Number of Fields） |
| BEGIN/END  | 文件处理前/后自动执行              |

---

### 讲解口播内容（可配合示例代码分开讲解）

> awk 是用来批量处理文本和数据表的工具，非常适合做列筛选、分隔、聚合、格式化。它可以像 Excel 一样，直接按列取数据，还可以加条件筛选、做总计，非常适合批量日志分析或数据统计。只要记住 awk ‘{print \$1, \$2}’ 文件名，基本用法就会了，高级点还可以加分隔符和条件。

---

### 示例代码

```bash
# 打印每行第1列
awk '{print $1}' data.txt

# 逗号分隔，输出第2列
awk -F ',' '{print $2}' info.csv

# 只输出第3列大于100的行
awk '$3 > 100 {print $0}' report.txt

# 计算所有行第2列的总和
awk '{sum += $2} END {print sum}' salary.txt

# 行号和内容一起输出
awk '{print NR, $0}' file.txt
```
