Skip to content

awk 命令

基本用法

打印行

bash
#!/bin/bash

# 打印所有行
awk '{print}' file.txt

# 打印特定行
awk 'NR==5' file.txt

打印字段

bash
#!/bin/bash

# 打印第一个字段
awk '{print $1}' file.txt

# 打印多个字段
awk '{print $1, $2, $3}' file.txt

# 打印所有字段
awk '{print $0}' file.txt

内置变量

NR 和 NF

bash
#!/bin/bash

# 打印行号
awk '{print NR, $0}' file.txt

# 打印字段数
awk '{print NF, $0}' file.txt

FS 和 OFS

bash
#!/bin/bash

# 设置字段分隔符
awk -F: '{print $1, $3}' /etc/passwd

# 设置输出字段分隔符
awk 'BEGIN{OFS="-"} {print $1, $2, $3}' file.txt

RS 和 ORS

bash
#!/bin/bash

# 设置记录分隔符
awk 'BEGIN{RS=","} {print}' file.txt

# 设置输出记录分隔符
awk 'BEGIN{ORS="\n\n"} {print}' file.txt

模式匹配

基本匹配

bash
#!/bin/bash

# 匹配包含 pattern 的行
awk '/pattern/ {print}' file.txt

# 匹配不包含 pattern 的行
awk '!/pattern/ {print}' file.txt

字段匹配

bash
#!/bin/bash

# 匹配第一个字段
awk '$1 ~ /pattern/ {print}' file.txt

# 匹配第二个字段
awk '$2 ~ /pattern/ {print}' file.txt

关系运算

bash
#!/bin/bash

# 第一个字段大于 10
awk '$1 > 10 {print}' file.txt

# 第二个字段等于 "pattern"
awk '$2 == "pattern" {print}' file.txt

BEGIN 和 END

BEGIN 块

bash
#!/bin/bash

# 在处理前执行
awk 'BEGIN {print "开始处理"} {print}' file.txt

END 块

bash
#!/bin/bash

# 在处理后执行
awk '{print} END {print "处理完成"}' file.txt

实用示例

示例1:计算总和

bash
#!/bin/bash

# 计算第一列的总和
awk '{sum += $1} END {print sum}' file.txt

# 计算平均值
awk '{sum += $1; count++} END {print sum/count}' file.txt

示例2:过滤数据

bash
#!/bin/bash

# 过滤第一列大于 10 的行
awk '$1 > 10 {print}' file.txt

# 过滤第二列等于 "pattern" 的行
awk '$2 == "pattern" {print}' file.txt

示例3:格式化输出

bash
#!/bin/bash

# 格式化输出
awk '{printf "%-10s %-10s\n", $1, $2}' file.txt

示例4:统计信息

bash
#!/bin/bash

# 统计行数
awk 'END {print NR}' file.txt

# 统计字段数
awk '{sum += NF} END {print sum/NR}' file.txt

最佳实践

1. 使用 -F 选项

bash
# 好的做法
awk -F: '{print $1, $3}' /etc/passwd

# 不好的做法
awk 'BEGIN{FS=":"} {print $1, $3}' /etc/passwd

2. 使用 printf

bash
# 好的做法
awk '{printf "%-10s %-10s\n", $1, $2}' file.txt

# 不好的做法
awk '{print $1, $2}' file.txt

3. 使用 BEGIN 和 END

bash
# 好的做法
awk 'BEGIN {print "开始"} {print} END {print "结束"}' file.txt

# 不好的做法
echo "开始"
awk '{print}' file.txt
echo "结束"

总结

awk 命令的关键点:

  1. 基本用法awk 'command' file.txt
  2. 内置变量NRNFFSOFSRSORS
  3. 模式匹配:基本匹配、字段匹配、关系运算
  4. BEGIN 和 END:在处理前和后执行
  5. 实用示例:计算总和、过滤数据、格式化输出、统计信息
  6. 最佳实践:使用 -F 选项、使用 printf、使用 BEGINEND

下一节我们将学习 cut 命令的使用。