Appearance
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.txtFS 和 OFS
bash
#!/bin/bash
# 设置字段分隔符
awk -F: '{print $1, $3}' /etc/passwd
# 设置输出字段分隔符
awk 'BEGIN{OFS="-"} {print $1, $2, $3}' file.txtRS 和 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.txtBEGIN 和 END
BEGIN 块
bash
#!/bin/bash
# 在处理前执行
awk 'BEGIN {print "开始处理"} {print}' file.txtEND 块
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/passwd2. 使用 printf
bash
# 好的做法
awk '{printf "%-10s %-10s\n", $1, $2}' file.txt
# 不好的做法
awk '{print $1, $2}' file.txt3. 使用 BEGIN 和 END
bash
# 好的做法
awk 'BEGIN {print "开始"} {print} END {print "结束"}' file.txt
# 不好的做法
echo "开始"
awk '{print}' file.txt
echo "结束"总结
awk 命令的关键点:
- 基本用法:
awk 'command' file.txt - 内置变量:
NR、NF、FS、OFS、RS、ORS - 模式匹配:基本匹配、字段匹配、关系运算
- BEGIN 和 END:在处理前和后执行
- 实用示例:计算总和、过滤数据、格式化输出、统计信息
- 最佳实践:使用
-F选项、使用printf、使用BEGIN和END
下一节我们将学习 cut 命令的使用。