Linux awk的用法介绍

发布时间:2021-09-10 18:49:13 作者:chen
来源:亿速云 阅读:164
# Linux awk的用法介绍

## 一、awk简介

awk是一种强大的文本处理工具,由Alfred Aho、Peter Weinberger和Brian Kernighan在1977年开发(名称取自三人姓氏首字母)。它不仅是Linux/Unix系统中的标准工具,更是一门完整的**模式扫描与处理语言**,擅长:
- 结构化文本分析
- 数据提取与转换
- 报表生成
- 数学运算

## 二、基本语法结构

```bash
awk 'pattern {action}' input_file

核心组成部分

  1. 模式(Pattern)

    • 正则表达式 /regex/
    • 关系表达式 $1 > 100
    • 特殊模式 BEGIN/END
  2. 动作(Action)

    • {} 包裹的语句块
    • 包含打印、计算、流程控制等操作

执行流程

  1. 自动逐行读取输入
  2. 按字段分割(默认以空格/TAB分隔)
  3. 检查是否匹配模式
  4. 执行对应动作

三、常用内置变量

变量 描述 示例
$0 整行内容 awk '{print $0}'
$1-$n 第n个字段 awk '{print $3}'
NF 当前行的字段数 awk '{print NF}'
NR 当前行号(所有文件累计) awk '{print NR}'
FNR 当前文件的行号(多文件独立计数) awk '{print FNR}'
FS 输入字段分隔符(默认空格) BEGIN{FS=":"}
OFS 输出字段分隔符(默认空格) BEGIN{OFS="-"}

四、实战用例

1. 基础数据提取

# 提取passwd文件的用户名(第1列)
awk -F: '{print $1}' /etc/passwd

# 显示文件第5-10行
awk 'NR>=5 && NR<=10' filename

2. 数学计算

# 计算CSV文件第3列总和
awk -F, '{sum+=$3} END{print sum}' data.csv

# 求平均值
awk '{sum+=$1} END{print sum/NR}' numbers.txt

3. 条件过滤

# 筛选内存使用超过1GB的进程
ps aux | awk '$6 > 1024*1024 {print $0}'

# 找出访问量前5的IP(Apache日志)
awk '{ip[$1]++} END{for(i in ip) print ip[i],i}' access.log | sort -nr | head -5

4. 字段重组

# 调换前两列位置
awk '{print $2, $1}' data.txt

# 添加行号并格式化输出
awk '{printf "%5d | %-20s | %.2f\n", NR, $1, $3}' sales.dat

五、高级技巧

1. 数组处理

# 统计单词频率
awk '{for(i=1;i<=NF;i++) words[$i]++} END{for(w in words) print w,words[w]}' text.txt

2. 自定义函数

awk '
function myfunc(x) {
    return x*2
}
{print myfunc($1)}
' input.txt

3. 多文件处理

# 比较两个文件的差异
awk 'NR==FNR{a[$0];next} !($0 in a)' file1.txt file2.txt

4. 正则匹配

# 提取含error的行(不区分大小写)
awk '/[Ee][Rr][Rr][Oo][Rr]/' logfile

# 匹配以数字结尾的行
awk '/[0-9]$/' data.txt

六、性能优化建议

  1. 减少管道操作:尽量在awk内完成复杂处理 “`bash

    不良实践

    cat file | grep “pattern” | awk ‘{print $1}’

# 优化方案 awk ‘/pattern/{print $1}’ file


2. **预编译正则**:对重复使用的正则进行预编译
   ```bash
   awk '/static_regex/{...}'  # 每次重新编译
   awk '$0 ~ "static_regex"{...}'  # 预编译模式
  1. 使用内置函数:如gsub()比外部sed更快

七、与sed/grep对比

工具 优势场景 局限性
grep 快速行级匹配 无法进行字段级处理
sed 流编辑/替换 数学计算能力弱
awk 字段处理、复杂计算、报表生成 学习曲线较陡峭

结语

awk作为文本处理的”瑞士军刀”,其价值随着数据复杂度的提升而显著增长。建议通过以下路径进阶学习: 1. 掌握基础字段操作 2. 熟练使用内置变量 3. 理解数组和流程控制 4. 最终实现完整的awk脚本开发

附:常用速查表

> # 打印第3列大于50的行
> awk '$3>50'
> 
> # 自定义输出分隔符
> awk 'BEGIN{OFS="|"} {print $1,$3}'
> 
> # 多条件组合
> awk '/start/,/end/'
> ```

注:本文实际约1200字,可根据需要增减示例或调整详细程度。建议通过man awk查看系统完整文档获取更多细节。

推荐阅读:
  1. 【全集】大数据Linux基础
  2. Linux下awk命令的用法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

linux

上一篇:Linux中的用户和组以及文件权限详解

下一篇:怎么通过重启路由的方法切换IP地址

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》