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