千家信息网

Linux awk 命令详解

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,AWK是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Fam
千家信息网最后更新 2025年12月01日Linux awk 命令详解

AWK是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

使用方法 : awk '{pattern + action}' {filenames}

awk内置变量:

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

$0 完整的输入记录

ARGC 命令行参数的数目

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

ARGV 包含命令行参数的数组

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

ERRNO 最后一个系统错误的描述

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

FILENAME 当前文件名

FNR 各文件分别计数的行号

FS 设置输入域分隔符,等价于命令行 -F选项

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

NF 一条记录的字段的数目

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

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

OFS 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符

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

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

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

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

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

$NF是number finally,表示最后一列的信息,跟变量NF是有区别的,变量NF统计的是每行列的总数

format格式:

%c:显示单个字符

%d,%i:十进制整数

%e,%E:科学计数法显示数值

%f:显示浮点数

%g,%G:以科学计数法的格式或浮点数的格式显示数值

%s:显示字符串

%u:无符号整数

%%:显示%自身

修饰符:

N:显示宽度,N为数字

-:左对齐,默认为右对齐

+:显示数值符号

\t 制表符

\n 换行符

~ 匹配,与==相比不是精确比较

!~ 不匹配,不精确比较

== 等于,必须全部相等,精确比较

!= 不等于,精确比较

&&  逻辑与

|| 逻辑或

+ 匹配时表示1个或1个以上

/[0-9][0-9]+/ 两个或两个以上数字

/[0-9][0-9]*/ 一个或一个以上数字

awk 列输出:

1.搜索/etc/passwd有root关键字的所有行

[root@127-0-0-1 scripts]# awk '/root/' /etc/passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

2.搜索/etc/passwd有root关键字的所有行,并输出shell列

[root@127-0-0-1 scripts]# awk -F ":" '/root/ {print $7}' /etc/passwd

/bin/bash

/sbin/nologin

3.统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容

[root@127-0-0-1 scripts]# awk -F ":" '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd

filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash

filename:/etc/passwd,linenumber:2,columns:7,linecontent:bin:x:1:1:bin:/bin:/sbin/nologin

filename:/etc/passwd,linenumber:3,columns:7,linecontent:daemon:x:2:2:daemon:/sbin:/sbin/nologin

filename:/etc/passwd,linenumber:4,columns:7,linecontent:adm:x:3:4:adm:/var/adm:/sbin/nologin

filename:/etc/passwd,linenumber:5,columns:7,linecontent:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

filename:/etc/passwd,linenumber:6,columns:7,linecontent:sync:x:5:0:sync:/sbin:/bin/sync

filename:/etc/passwd,linenumber:7,columns:7,linecontent:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

filename:/etc/passwd,linenumber:8,columns:7,linecontent:halt:x:7:0:halt:/sbin:/sbin/halt

filename:/etc/passwd,linenumber:9,columns:7,linecontent:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

filename:/etc/passwd,linenumber:10,columns:7,linecontent:uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

filename:/etc/passwd,linenumber:11,columns:7,linecontent:operator:x:11:0:operator:/root:/sbin/nologin

filename:/etc/passwd,linenumber:12,columns:7,linecontent:games:x:12:100:games:/usr/games:/sbin/nologin

filename:/etc/passwd,linenumber:13,columns:7,linecontent:gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

filename:/etc/passwd,linenumber:14,columns:7,linecontent:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

filename:/etc/passwd,linenumber:15,columns:7,linecontent:nobody:x:99:99:Nobody:/:/sbin/nologin

filename:/etc/passwd,linenumber:16,columns:7,linecontent:dbus:x:81:81:System message bus:/:/sbin/nologin

filename:/etc/passwd,linenumber:17,columns:7,linecontent:vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

filename:/etc/passwd,linenumber:18,columns:7,linecontent:abrt:x:173:173::/etc/abrt:/sbin/nologin

filename:/etc/passwd,linenumber:19,columns:7,linecontent:saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin

filename:/etc/passwd,linenumber:20,columns:7,linecontent:postfix:x:89:89::/var/spool/postfix:/sbin/nologin

filename:/etc/passwd,linenumber:21,columns:7,linecontent:haldaemon:x:68:68:HAL daemon:/:/sbin/nologin

filename:/etc/passwd,linenumber:22,columns:7,linecontent:ntp:x:38:38::/etc/ntp:/sbin/nologin

filename:/etc/passwd,linenumber:23,columns:7,linecontent:sshd:x:74:74::/var/empty/sshd:/bin/false

filename:/etc/passwd,linenumber:24,columns:7,linecontent:zabbix:x:498:498:Zabbix Monitoring System:/var/lib/zabbix:/bin/bash

filename:/etc/passwd,linenumber:25,columns:7,linecontent:ntop:x:497:497:ntop:/var/lib/ntop:/sbin/nologin

filename:/etc/passwd,linenumber:26,columns:7,linecontent:tcpdump:x:72:72::/:/sbin/nologin

filename:/etc/passwd,linenumber:27,columns:7,linecontent:dev:x:500:500::/home/dev:/bin/bash

filename:/etc/passwd,linenumber:28,columns:7,linecontent:ops:x:501:501::/home/ops:/bin/bash

filename:/etc/passwd,linenumber:29,columns:7,linecontent:qa:x:502:502::/home/qa:/bin/bash

filename:/etc/passwd,linenumber:30,columns:7,linecontent:bigdata:x:503:503::/home/bigdata:/bin/bash

filename:/etc/passwd,linenumber:31,columns:7,linecontent:test:x:504:504::/home/test:/bin/bash

filename:/etc/passwd,linenumber:32,columns:7,linecontent:autobots:x:505:505::/home/autobots:/bin/bash

filename:/etc/passwd,linenumber:33,columns:7,linecontent:netdata:x:496:496:netdata:/opt/netdata:/sbin/nologin

filename:/etc/passwd,linenumber:34,columns:7,linecontent:mysql:x:506:506:MySQL Server:/home/mysql:/bin/bash

filename:/etc/passwd,linenumber:35,columns:7,linecontent:gluster:x:495:495:GlusterFS daemons:/var/run/gluster:/sbin/nologin

filename:/etc/passwd,linenumber:36,columns:7,linecontent:apache:x:48:48:Apache:/var/www:/sbin/nologin

filename:/etc/passwd,linenumber:37,columns:7,linecontent:mysql-proxy:x:494:494:MySQL-Proxy user:/:/sbin/nologin

4.打印/etc/passwd/的第二行信息

[root@127-0-0-1 scripts]# awk 'NR==2{print "filename:" FILENAME,$0}' /etc/passwd

filename:/etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin

5.获取第12到30行的第一列的信息

[root@127-0-0-1 scripts]# awk -F ":" '{if(NR > 12 && NR < 30) print $1}' /etc/passwd

gopher

ftp

nobody

dbus

vcsa

abrt

saslauth

postfix

haldaemon

ntp

sshd

zabbix

ntop

tcpdump

dev

ops

qa

6.多分隔符的使用,多个分隔符利用[]然后在里面写分隔符即可

[root@127-0-0-1 scripts]# cat yoon.txt

192.168.1.1:3307

[root@127-0-0-1 scripts]# awk -F '[.:]' '{print $1,$5}' yoon.txt

192 3307

7.添加了BEGIN和END

hello world

[root@127-0-0-1 scripts]# cat long.txt

2 this is a test

3 Are you like awk

This's a test

10 There are orange,apple,mongo

[root@127-0-0-1 scripts]# cat long.txt | awk 'BEGIN{print "name,shell"} {print $1,$NF} END {print "hello world"}'

name,shell

2 test

3 awk

This's test

10 orange,apple,mongo

hello world

8.忽略大小写

[root@127-0-0-1 scripts]# awk 'BEGIN{IGNORECASE=1} /this/' long.txt

2 this is a test

This's a test

9.使用正则,字符串匹配

输出第二列包含 "th",并打印第二列与第四列

[root@127-0-0-1 scripts]# awk '$2 ~ /th/ {print $2,$4}' long.txt

this a

10.输出第二列不包含 "th",并打印第二列与第四列

[root@127-0-0-1 scripts]# awk '$2 !~ /th/ {print $2,$4}' long.txt

Are like

a

11.匹配包含27为数字开头的行,如27,277,2777...

awk '/[2][7][7]*/{print $0}' /etc/passwd 匹配包含27为数字开头的行,如27,277,2777...

12.awk自定义输出

awk '{print $1 $3}' part01 //$1与$3相连输出,不分隔

awk '{print $1,$3}' part01 //多了一个逗号,$1与$3使用空格分隔

awk '{print $1 " " $3}' part01 //$1与$3之间手动添加空格分隔

13.awk对字段数量做判断的输出

awk '{print $NF}' part01 //将每行第NF个字段的值打印出来

awk 'NF==4 {print }' part01 //显示只有4个字段的行

awk 'NF>2{print $0}' part01 //显示每行字段数量大于2的行

14.awk对行的处理

awk '{print NR,NF,$NF,"\t",$0}' part01 //依次打印行号,字段数,最后字段值,制表符,每行内容

awk 'NR==5{print}' part01 //显示第5行

awk 'NR==5 || NR==6{print}' part01 //显示第5行和第6行

awk 'NR!=1{print}' part01 //不显示第一行

15.匹配字符处理

//纯字符匹配 !//纯字符不匹配 ~//字段值匹配 !~//字段值不匹配 ~/a1|a2/字段值匹配a1或a2

awk '/mail/,/mysql/{print}' /etc/passwd //区间匹配

awk '/[2][7][7]*/{print $0}' /etc/passwd //匹配包含27为数字开头的行,如27,277,2777...

awk '$1~/mail/{print $1}' /etc/passwd //$1匹配指定内容才显示

awk '{if($1~/mail/) print $1}' /etc/passwd //与上面相同

awk '$1!~/mail/{print $1}' /etc/passwd //不匹配

16.IF语句,必须用在{}中,且比较内容用()扩起来

awk '{if($1~/mail/) print $1}' /etc/passwd //简写

awk '{if($1~/mail/) {print $1}}' /etc/passwd //全写

awk '{if($1~/mail/) {print $1} else {print $2}}' /etc/passwd //if...else...

17.条件表达式 == != > >=

awk '$1=="183.198.46.6"{print $4}' part01

awk '{if($1=="mysql") print $3}' /etc/passwd //与上面相同

awk '$1!="mysql"{print $3}' /etc/passwd //不等于

awk '$3>1000{print $3}' /etc/passwd //大于

awk '$3>=100{print $3}' /etc/passwd //大于等于

awk '$3<1{print $3}' /etc/passwd //小于

awk '$3<=1{print $3}' /etc/passwd //小于等于

18.逻辑运算符 && ||

awk '$1~/183.198.46.6/ && $4~/2015:19:14:40/ {print$7}' part01

awk '$1~/mail/ && $3>8 {print }' part01 //逻辑与,$1匹配mail,并且$3>8

awk '{if($1~/mail/ && $3>8) print }' /etc/passwd

awk '$1~/mail/ || $3>1000 {print }' /etc/passwd //逻辑或

awk '{if($1~/mail/ || $3>1000) print }' /etc/passwd

19.数值运算

awk '$3 > 100' /etc/passwd

awk '$3 > 100 || $3 < 5' /etc/passwd

awk '$3+$4 > 200' /etc/passwd

awk '/mysql|mail/{print $3+10}' /etc/passwd //第三个字段加10打印

awk '/mysql/{print $3-$4}' /etc/passwd //减法

awk '/mysql/{print $3*$4}' /etc/passwd //求乘积

awk '/MemFree/{print $2/1024}' /proc/meminfo //除法

awk '/MemFree/{print int($2/1024)}' /proc/meminfo //取整

20.格式化输出

awk '{printf "%-8d %-8s %-10s\n",$1,$2,$3}' part01

printf表示格式输出

%格式化输出分隔符,-8长度为8个数字,s表示字符串类型,打印每行前三个字段,指定第一个字段输出字符串类型(长度为8),第二个字段输出字符串类型(长度为8),第三个字段输出字符串类型(长度为10)

字段 输出 字符 分隔符 数字 字符串 格式 文件 换行符 逻辑 长度 命令 精确 内容 变量 数值 空格 类型 行号 分析 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 王牌战争守家服务器是和平服吗 hp源码 无数据库笔记本 pc机和服务器有什么关系 河北锦恩软件开发公司 适合网络安全的小标题四个字 影响it资源的网络安全 国外站群服务器租用价格 高中信息技术网络技术应用教科版 智能家居软件开发企业 健康云平台的网络安全问题 排版模板软件开发 数据库消缺 买优酷会员服务器繁忙 大连高新区 软件开发 男孩是学艺校还是软件开发好 新网络环境下计算机网络安全思考 服务器电源可以更换吗 网络安全设备组网拓扑图 嵌入式软件开发成本大吗 数据库运算符号怎么打出来 群星组建先驱者数据库失败 王牌战争守家服务器是和平服吗 软件开发 中间件 服务器上的代码导入功能 北仑嵌入式软件开发项目 数据库的部分怎么授权 本科生网络安全论文题目 魔兽世界335服务器 wdcp服务器搬家 平顶山网络技术质量
0