awk的作用是啥?

1 个回答

  • 松林
    入体冰凉的月光,都比不上你绝情的目光。
    ### **一、`awk` 的基本用法** `awk` 按行处理文本数据,将每行分为多个字段,依次执行指定的操作。 #### **基本语法** ```bash awk '条件 {动作}' 文件名 ``` - 条件:决定哪些行执行操作。 - 动作:对符合条件的行执行操作(如打印、计算)。 #### **示例 1:打印每一行内容** 命令: ```bash awk '{print $0}' demo.txt ``` 输入文件 (`demo.txt`): ```text apple banana cherry dog cat mouse ``` 结果: ```text apple banana cherry dog cat mouse ``` 解释:`$0` 表示整行内容。 #### **示例 2:打印指定字段** 命令: ```bash awk '{print $2}' demo.txt ``` 结果: ```text banana cat ``` 解释:`$2` 表示当前行的第 2 列。 #### **示例 3:指定字段分隔符** 命令: ```bash awk -F ':' '{print $1}' passwd.txt ``` 输入文件 (`passwd.txt`): ```text root:x:0:0:root:/root:/bin/bash bin:x:2:2:bin:/bin:/usr/sbin/nologin ``` 结果: ```text root bin ``` 解释:`-F ':'` 指定 `:` 为分隔符,`$1` 表示分隔后的第一列。 ### **二、`awk` 的内置变量** #### **1. NF:字段数** 命令: ```bash awk '{print NF}' demo.txt ``` 结果: ```text 3 3 ``` 解释:`NF` 是字段总数,表示每行有几个字段。 #### **2. $NF:最后一个字段** 命令: ```bash awk '{print $NF}' demo.txt ``` 结果: ```text cherry mouse ``` 解释:`$NF` 是最后一个字段。 #### **3. NR:当前行号** 命令: ```bash awk '{print NR, $0}' demo.txt ``` 结果: ```text 1 apple banana cherry 2 dog cat mouse ``` 解释:`NR` 表示当前行的行号。 #### **4. FILENAME:当前文件名** 命令: ```bash awk '{print FILENAME, $1}' demo.txt ``` 结果: ```text demo.txt apple demo.txt dog ``` 解释:`FILENAME` 返回当前正在处理的文件名。 ### **三、条件与过滤** #### **示例 1:筛选包含特定关键字的行** 命令: ```bash awk '/banana/ {print $0}' demo.txt ``` 结果: ```text apple banana cherry ``` 解释:`/banana/` 是正则表达式,匹配包含 `banana` 的行。 #### **示例 2:筛选字段值满足条件的行** 命令: ```bash awk '$3 == "mouse" {print $0}' demo.txt ``` 结果: ```text dog cat mouse ``` 解释:`$3 == "mouse"` 筛选第 3 列等于 `mouse` 的行。 #### **示例 3:按行号过滤** 命令: ```bash awk 'NR > 1 {print $0}' demo.txt ``` 结果: ```text dog cat mouse ``` 解释:`NR > 1` 过滤第 2 行及以后的内容。 ### **四、`awk` 函数** #### **示例 1:转换为大写** 命令: ```bash awk '{print toupper($1)}' demo.txt ``` 结果: ```text APPLE DOG ``` 解释:`toupper($1)` 将第 1 列内容转为大写。 #### **示例 2:字符串长度** 命令: ```bash awk '{print length($2)}' demo.txt ``` 结果: ```text 6 3 ``` 解释:`length($2)` 返回第 2 列的字符串长度。 #### **示例 3:获取子字符串** 命令: ```bash awk '{print substr($3, 1, 3)}' demo.txt ``` 结果: ```text che mou ``` 解释:`substr($3, 1, 3)` 提取第 3 列的前 3 个字符。 ### **五、结合实际案例** #### **案例 1:找出响应时间最长的日志记录** 输入文件 (`access.log`): ```text 192.168.0.1 - - [01/Dec/2023:10:00:00] "GET /index.html" 200 1024 0.234 192.168.0.2 - - [01/Dec/2023:10:01:00] "GET /about.html" 200 2048 0.564 192.168.0.3 - - [01/Dec/2023:10:02:00] "GET /contact.html" 200 512 0.124 ``` 命令: ```bash awk '{print $NF, $0}' access.log | sort -nr | head -n 1 ``` 结果: ```text 0.564 192.168.0.2 - - [01/Dec/2023:10:01:00] "GET /about.html" 200 2048 0.564 ``` 解释: - `$NF` 提取响应时间(最后一列)。 - `sort -nr` 按响应时间降序排列。 - `head -n 1` 取第一条记录。 #### **案例 2:统计文件的行数** 命令: ```bash awk 'END {print NR}' demo.txt ``` 结果: ```text 2 ``` 解释:`END` 块在文件处理完成后执行,`NR` 是总行数。 #### **案例 3:筛选字段值范围** 命令: ```bash awk '$2 > 3 && $2 < 7 {print $0}' numbers.txt ``` 输入文件 (`numbers.txt`): ```text 1 2 2 4 3 6 4 8 ``` 结果: ```text 2 4 3 6 ``` 解释:`$2 > 3 && $2 < 7` 筛选第 2 列值在 3 和 7 之间的行。 ### **六、总结与常用命令回顾** 常用命令示例 | 功能 | 命令示例 | 结果 | |---------------------------|----------------------------------------------|--------------------------| | 打印整行 | `awk '{print $0}' file` | 输出每一行完整内容 | | 打印特定列 | `awk '{print $2, $3}' file` | 输出第 2 列和第 3 列 | | 指定分隔符 | `awk -F ':' '{print $1}' file` | 按 `:` 分隔,打印第 1 列 | | 筛选包含关键字的行 | `awk '/keyword/ {print $0}' file` | 匹配包含 `keyword` 的行 | | 筛选字段值满足条件的行 | `awk '$3 > 100 {print $0}' file` | 第 3 列大于 100 的行 | | 字段值转为大写 | `awk '{print toupper($1)}' file` | 第 1 列转为大写 | | 输出总行数 | `awk 'END {print NR}' file` | 文件总行数 | | 找到响应时间最长的日志记录 | `awk '{print $NF, $0}' log | sort -nr | head -n 1` | 响应时间最长的行 |
    发布于 2024-12-01 11:11 •IP属地 云南
    举报
    评论
    收藏