千家信息网

awk详解及举例

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,AWK语言v 选项:-F :指明输入时用到的字段分隔符-v var=value: 定义变量v 分割符、域和记录awk 执行时,由 分隔符分隔的字段(域)标记$1,$2..$n称 称为域标识。$0 为所
千家信息网最后更新 2026年11月01日awk详解及举例

AWK语言

v 选项:

-F :指明输入时用到的字段分隔符

-v var=value: 定义变量

v 分割符、域和记录

awk 执行时,由 分隔符分隔的字段(域)标记$1,$2..$n称 称

为域标识。$0 为所有域,注意:和shell 中变量$ 符含义不同

文件的每一行称为记录

省略action行 ,则默认执行 print $0 的 的

$0:打印所有

v 示例:

awk '{print "hello,awk"}'

awk -F: '{print}' /etc/passwd

awk -F: '{print "wang"}' /etc/passwd

awk -F: '{print $1}' /etc/passwd

awk -F: '{print $0}' /etc/passwd

awk -F: '{print $1"\t"$3}' /etc/passwd

tail -3 /etc/fstab |awk '{print $2,$4}'

awk 变量

v 变量:内 置 和自定义变量

v FS :输入字段分隔符,默认为空白字符

awk -v FS=':' '{print $1,FS,$3}' /etc/passwd

awk -F: '{print $1,$3,$7}' /etc/passwd

v OFS :输出字段分隔符,默认为空白字符

awk -v FS=':' -v OFS=':' '{print $1,$3,$7}' /etc/passwd

vRS:输入记录分隔符,指定输入时的换行符,原换行符仍有效

awk -v RS=' ' '{print }' /etc/passwd

v ORS :输出记录分隔符,输出时用指定符号代替换行符

awk -v RS=' ' -v ORS='###''{print }' /etc/passwd

打印奇数行或者偶数行:

计算的一些简单方法

统计一文件里单词出现的次数:

NF :字段数量

awk -F:: '{print NF}' /etc/fstab, 引用内置变量不用$

awk -F: '{print $(NF-1)}' /etc/passwd

v NR :行号

FNR :各文件分别计数, 行号

awk '{print FNR}' /etc/fstab /etc/inittab

FILENAME :当前文件名

awk '{print FILENAME}' /etc/fstab

打印出来时将所属文件名也打印出来

ARGC :命令行参数的个数

awk '{print ARGC}' /etc/fstab /etc/inittab

awk 'BEGIN {print ARGC}' /etc/fstab /etc/inittab

v ARGV:数组,保存的是命令行所给定的各参数

自定义变量( 区分 字符大小写)

(1) -v var=value

(2) 在program

变量放在{}里和外边的区别:

{}内:每次执行时都要赋值一次

{}外:执行之前先赋值,以后循环使用

-f :调用脚本

printf命令

后边有几个变量,前边就应该有几个格式的定义,即几个%定义,百分号定义和变量要一一对应

v 格式化输出:printf "FORMAT " , item1, item2, ...

(1) 必须指定FORMAT

(2) 不会自动换行,需要显式给出换行控制符,\n

(3) FORMAT 中需要分别为后面每个item 指定格式符

v 格式符:与item 一一对应

%c: 显示字符的ASCII码 码

%d, %i: 显示十进制整数

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

%f :显示为浮点数

10.3:总共10位,包括3个0,一个小数点

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

%s :显示字符串

%u :无符号整数

下图为10个字符:

%%: 显示% 自身

v 修饰符:

#[.#] :第一个数字控制显示的宽度;第二个# 表示小数点后精度,%3.1f

-: 左对齐(默认右对齐) %-15s

+号:显示数值的正负符号 %+d

BEGIN:在前面加一个表头

操作符

v 算术操作符:

x+y, x-y, x*y, x/y, x^y, x%y

-x: 转换为负数

+x: 转换为数值

v 字符串操作符:没有符号的操作符,字符串连接

v 赋值操作符:

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

++, --

v 比较操作符:

==, !=, >, >=, <, <=

v 模式匹配符:~

将/etc/passwd中匹配的是root的打印出来:

将df里以/dev/sd开头的打印出来

左边不和右边匹配包含 !~:不包含bash的行

++在前:先加再打印

++在后:先打印再加:(--同理)

逻辑操作符:与 与&& ,或||,非!

cmd1 与cmd2:两个命令都要执行,都执行完再决定最终的结果为真还是假

cmd1 && cmd2:先看第一个为真,假;如果第一个为假,那么后边的不管真假与第一个都是假,所以有可能后续的不执行

在awk里的&&的意思与cmd1 与cmd2的含义一样:

条件表达式(三目表达式):

selector?if-true-expression:if-false-expression

如果selector?成立,则执行if-true-expression

如果selector?不成立,则执行if-false-expression

因为?和:将条件表达式分成了三段,所以称为三目表达式

relational expression: 关系表达式,结果为"真"才会被处理

真:结果为非0 值,非空字符串

假:结果为空字符串或0值

数字里:0为假,非0为真

字符串:只要不为空都为真

line ranges:: 行范围

startline,endline :/pat1/,/pat2/ 不支持直接给 出数字

格式

awk -F: '/^root\>/,/^nobody\>/{print $1}'

/etc/passwd

awk -F: '(NR>=10&&NR<=20){print NR,$1}'

/etc/passwd

NR:文件的行号

NF:文件每行的以符号分割的列数

v (5) BEGIN/END 模式

BEGIN{}: 仅在开始处理文件中的文本之前执行一次

END{} :仅在文本处理完成之后执行

awk 控制语句if-else

v 语法:if(condition){statement;…}[else statement]

if(condition1){statement1}else if(condition2){statement2}

else{statement3}

v 使用场景:对awk 取得的整行或某个字段做条件判

查看是否有防火墙以及查看端口号

将9000端口改为默认80

awk 控制语句

v while 循环

v 语法:while(condition){statement;…}

v 条件"真",进入循环;条件"假", 退出循环

v 使用场景:

对一行内的多个字段逐一类似处理时使用

对数组中的各元素逐一处理时使用

打印以root开头的,从第一列开始一直循环到最后一列,当小于最后一列时,将该字符长度和名字打印出来,然后i++,一直循环到最后一列

do-while 循环

v 语法:do {statement;…}while(condition)

v无论真假,至少执行一次循环体

-s后可以指定分隔符

for 循环

v 语法:for(expr1;expr2;expr3) {statement;…}

v 常见用法:

for(variable assignment;condition;iteration process)

{for-body}

v 特殊用法:能够遍历数组中的元素

语法:for(var in array) {for-body}

next:

提前结束对本行处理而直接进入下一行处理(awk 自身循环)

awk 数组

v 关联数组:array[index-expression]

v index-expression:

(1) 可使用任意字符串;字符串要使用双引号括起来

(2) 如果某数组元素事先不存在,在引用时,awk 会自动创建

此元素,并将其值初始化为"空串"

若要判断数组中是否存在某元素,要使用"index in array"格 格

式进行遍历

第一步:第一行1进来,$0为1,abc[1]没有赋值为空,为0;!Abc[1]为1 ,abc[1]++为1;(1,1)

第二步:第二行进来,$0为2,abc[2]没有赋值为空,为0;!Abc[2]为1,abc[2]++为1;(2,1)

第三步:第三行进来,$0为1,abc[1]为1,因为第一步已经对abc[1]赋值!Abc[1]为0,abc[1]++为2 ;所以(1,2)

第四步:第四行2进来,$0为2,abc[2]为1,因为第二步已经对abc[2]赋值,

!Abc[2]为0,abc[2]++为2 ;所以(2,2)

第五步:第五行3进来,$0为3,abc[3]没有赋值为空,等于0;!Abc[3]为1,abc[3]++为1;所以(3,1)

以下的同上

awk 数组

v 若要遍历数组中的每个元素,要使用for 循环

v for(var in array) {for-body}

v 注意:var 会遍历array

统计单词出现的次数:(通用代码,统计别的文件也通用)

统计男生和女生平均成绩多少?

awk 函数

v 数值处理:

rand() :返回0 和1 之间一个随机数

v 字符串处理:

length([s]) :返回指定字符串的长度

sub(r,s,[t]) :对t 字符串进行搜索r 表示的模式匹配的内容,并将第一个匹

配的内容替换为s

echo "2008:08:08 08:08:08" | awk 'sub(/:/,"-",$1)'

gsub(r,s,[t]) :对t 字符串进行搜索r 表示的模式匹配的内容,并全部替换

为为s 所表示的内容

echo "2008:08:08 08:08:08" | awk 'gsub(/:/,"-",$0)'

split(s,array,[r]) :以r 为分隔符 , 切割字符串s ,并将切割后的结果保存

至至array 所表示的数组中,第一个索引值为1, 第二个索引值为2,…

netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}

END{for (i in count) {print i,count[i]}}'

awk 函数

v 自定义函数

v 格式:

function name ( parameter, parameter, ... ) {

statements

return expression

}

v 示例:

#cat fun.awk

function max(v1,v2) {

v1>v2?var=v1:var=v2

return var

}

BEGIN{a=3;b=2;print max(a,b)}

awk 脚本

v将 将awk 程序写成脚本,直接调用或执行

v 示例:

#cat f1.awk

{if($3>=1000)print $1,$3}

#awk -F: -f f1.awk /etc/passwd

#cat f2.awk

#!/bin/awk -f

#this is a awk script

{if($3>=1000)print $1,$3}

#chmod +x f2.awk

#f2.awk -F: /etc/passwd

向awk 脚本传递参数

v 格式:

awkfile var=value var2=value2... Inputfile

v 注意 :在BEGIN 过程 中不可用。直到 首行输入完成以后 ,变

量才可用 。可以通过-v 参数,让awk 在执行BEGIN 之前得到

变量的值。命令行中每一个指定的变量都需要一个-v 参数

v 示例:

#cat test.awk

#!/bin/awk -f

{if($3 >=min && $3<=max)print $1,$3}

#chmod +x test.awk

#test.awk -F: min=100 max=200 /etc/passwd

字符 变量 字符串 循环 数组 文件 处理 分隔符 格式 字段 操作符 元素 参数 命令 数值 条件 符号 结果 表达式 语法 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网金融科技 上海互联网科技有限公司 北京互联网科技公司 深圳天众互联网科技公司 深圳艾佳互联网科技 互联网科技公司名称 中国科技互联网公司收入 互联网科技热点资讯 中化能源互联网科技招聘 乌苏新华互联网科技做什么的 洛阳共同富裕互联网科技有限公司 工业互联网等科技实现智能化赋能 伊宁互联网科技做什么的 合肥互联网科技公司公章图片 启辰互联网科技 济南小医互联网科技有限公司招聘 科技互联网行业投资研究 张家口科技产业互联网平台 悟空问答互联网科技 河南商务圈互联网科技有限公司 为想互联网科技 紫鲸互联网科技 互联网金融监管科技 互联网科技生活的内容 互联网 科技馆 华夏互联网科技业 无锡工业互联网科技有限公司 产业互联网科技服务公司 互联网科技包装股份有限公司上市 张家口科技产业互联网平台
0