导航菜单

Linux命令大全-awk命令

陆兴东 2026-04-03 109 浏览 Linux命令

一、简介

awk命令的主要功能是用于对文本或数据进行处理。使用该命令可以让用户根据自己自定义的属性或正则表达式,对文本或数据进行高效处理。

其次awk可以逐行读取文件或数据,并对数据提供类似于编程的功能,例如:字符串的处理和格式化输出、变量定义与计算和条件判断。它的这些特性让awk在处理结构化内容或数据时非常高效。

awk命令是由三位创始人Alfred Aho、Peter Weinberger、Brian Kernighan的姓氏缩写而来。

二、语法

语法:awk 参数 文件名

参数说明:

-f progfile:从文件读取awk程序代码

-F fs:设置字段分隔符(默认是空格)

-v var=val:在执行前设置变量值

-b:将所有字符视为单字节处理

-c:使用传统awk模式(禁用gawk扩展)

-C:显示版权信息

-d[file]:将全局变量输出到文件

-e:'程序文本' 指定awk程序代码

-E:file 从文件执行awk程序(更安全的方式)

-g:生成国际化模板文件(.pot)

-h:显示帮助信息

-L:[fatal] 检查代码的可疑问题

-n:识别八进制和十六进制数据

-N:使用本地化数字格式

-O:启用程序优化

-p[file]:生成性能分析报告

-P:启用严格POSIX模式

-r:启用正则表达式区间匹配

-S:沙盒模式(限制危险操作)

-t:检查旧版本兼容性

-V:显示版本信息

内置变量:

变量名称

变量描述

$n

当前记录的第n个字段,字段间由FS分隔

$0

完整的输入记录

ARGC

命令行参数的数目

ARGIND

命令行中当前文件的位置(从0开始算)

ARGV

包含命令行参数的数组

CONVFMT

数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组

ERRNO

最后一个系统错误的描述

FIELDWIDTHS

字段宽度列表(用空格键分隔)

FILENAME

当前文件名

FNR

各文件分别计数的行号

FS

字段分隔符(默认是任何空格)

IGNORECASE

如果为真,则进行忽略大小写的匹配

NF

一条记录的字段的数目

NR

已经读出的记录数,就是行号,从1开始

OFMT

数字的输出格式(默认值是%.6g)

OFS

输出字段分隔符,默认值与输入字段分隔符一致。

ORS

输出记录分隔符(默认值是一个换行符)

RLENGTH

由match函数所匹配的字符串的长度

RS

记录分隔符(默认是一个换行符)

RSTART

由match函数所匹配的字符串的第一个位置

SUBSEP

数组下标分隔符(默认值是/034)

运算符:

运算符

描述

= += -= *= /= %= ^= **=

赋值

?:

C条件表达式

||

逻辑或

&&

逻辑与

~ 和 !~

匹配正则表达式和不匹配正则表达式

< <= > >= != ==

关系运算符

空格

连接

+ -

加,减

* / %

乘,除与求余

+ - !

一元加,减和逻辑非

^ ***

求幂

++ --

增加或减少,作为前缀或后缀

$

字段引用

in

数组成员

三、 实战

1、打印整行

[root@Milvus ~]# awk '{print}' 
/etc/passwd
root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologin
============省略部分内容输出============

2、获取文件中第1,2列内容(默认以空格分隔)

[root@Milvus ~]# awk '{print $1,$2}' anaconda-ks.cfg 
#version=DEVEL 
# Systemauth --enableshadow

3、以“:”分隔,只获取第1列内容

[root@Milvus ~]# awk -F : '{print $1}' /etc/passwdrootbindaemon
============省略部分内容输出============

4、以“:”分隔,获取第3列大于等于1000(UID)的内容

[root@Milvus ~]# awk -F : '$3>=1000' /etc/passwdnfsnobody:x:65534:65534:Anonymous NFS 
User:/var/lib/nfs:/sbin/nologin
iwen:x:1000:1000:iwen:/home/iwen:/bin/bashtom:x:1001:1002::/home/tom:/bin/bash

5、以“:”分隔,获取第3列大于1000且第2列等于'tom'的行

[root@Milvus ~]# awk -F : '$3>1000 && $2="tom" ' 
/etc/passwd
nfsnobody tom 65534 65534 Anonymous NFS User 
/var/lib/nfs /sbin/nologin
tom tom 1001 1002  
/home/tom /bin/bash

6、只获取指定关键词(tom)的内容

[root@Milvus ~]# awk '/tom/{print}' 
/etc/passwd
tom:x:1001:1002::/home/tom:/bin/bash

7、以“:”分隔,获取文件中最后一列内容

[root@Milvus ~]# awk -F : '{print $NF}' /etc/passwd/bin/bash/sbin/nologin/bin/sync/sbin/shutdown/sbin/halt
============省略部分内容输出============