千家信息网

文件处理器之——awk

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,一、awk简介:awk 是一种编程语言,用于在 linux/unix 下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是
千家信息网最后更新 2026年11月03日文件处理器之——awk

一、awk简介:

awk 是一种编程语言,用于在 linux/unix 下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。

awk 的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有的操作的所指定的行都被处理。

二、awk的两种形式语法格式

awk [options] 'commands' filenames   //过滤并输出文件符合条件的内容awk [options] -f awk-script-file filenam      //从脚本中调用编辑指令,过滤并输出内容

options:

-F  定义输入字段分隔符,。默认的分隔符是空格或制表符(tab)

commands

BEGIN{} {} END{}行处理前 行处理 行处理后BEGIN{} 通常用于定义一些变量,例如 BEGIN{FS=":";OFS="---"}

使用BEGIN语句设置计数和打印头。BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文本开始执行,END语句用来在awk完成文本浏览动作后打印输出文本总数和结尾状态。

awk命令格式

awk 'pattern' filename          示例:awk -F: '/root/' /etc/passwd awk '{action}' filename         示例:awk -F: '{print $1}' /etc/passwd awk 'pattern {action}' filename 示例:awk -F: '/root/{print $1,$3}' /etc/passwd                                 示例:awk 'BEGIN{FS=":"} /root/{print $1,$3}' /etc/passwdcommand |awk 'pattern {action}' 示例:df -P| grep '/' |awk '$4 > 25000 {print $4}'

三、awk工作原理

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

(1)awk 使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,以换行符结束

(2)然后,行被:(默认为空格或制表符)分解成字段(或域),每个字段存储在已编号的变量中,从$1 开始,最多达 100 个字段

(3)awk 如何知道用空格来分隔字段的呢? 因为有一个内部变量 FS 来确定字段分隔符。初始时,FS 赋为空格

(4)awk 打印字段时,将以设置的方法使用 print 函数打印,awk 在打印的字段间加上空格,因为$1,$3 之间有一个逗号。逗号比较特殊,它映射为另一个内部变量,称为输出字段分隔符 OFS,OFS 默认为空格

(5)awk 输出之后,将从文件中获取另一行,并将其存储在$0 中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕

四、awk内建变量

FS:指定每行文本的字段分隔符,默认为空格或制表位。(-F)NF:当前处理的行的字段个数。NR:当前处理的行的行号(序数)。$0:当前处理的行的整行内容。$n:当前处理行的第 n 个字段(第 n 列)。FILENAME:被处理的文件名。RS:数据记录分隔,默认为\n,即每行为一条记录。


五、格式化输出

print函数

# date |awk '{print "Month: " $2 "\nYear: " $NF}'# awk -F: '{print "username is: " $1 "\t uid is: " $3}' /etc/passwd# awk -F: '{print "\tusername and uid: " $1,$3 "!"}' /etc/passwd

printf 函数

# awk -F: '{printf "%-15s %-10s %-15s\n", $1,$2,$3}' /etc/passwd# awk -F: '{printf "|%-15s| %-10s| %-15s|\n", $1,$2,$3}' /etc/passwd

%s 字符类型

%d 数值类型

占 15 字符

- 表示左对齐,默认是右对齐

printf 默认不会在行尾自动换行,加\n

===========================

六、awk模式

1、正则表达式:

匹配记录(整行):

# awk '/^alice/' /etc/passwd# awk '$0 ~ /^alice/' /etc/passwd# awk '!/alice/' passwd# awk '$0 !~ /^alice/' /etc/passwd

匹配字段:匹配操作符(~ !~)

# awk -F: '$1 ~ /^alice/' /etc/passwd# awk -F: '$NF !~ /bash$/' /etc/passwd

2、比较表达式:

比较表达式采用对文本进行比较,只有当条件为真,才执行指定的动作。比较表达式使用关系运算符,

用于比较数字与字符串。


关系运算符

运算符 含义 示例

< 小于 x= 大于等于 x>=y> 大于 x>y
# awk -F: '$3 == 0' /etc/passwd# awk -F: '$3 < 10' /etc/passwd# awk -F: '$7 == "/bin/bash"' /etc/passwd# awk -F: '$1 == "alice"' /etc/passwd# awk -F: '$1 ~ /alice/ ' /etc/passwd# awk -F: '$1 !~ /alice/ ' /etc/passwd# df -P | grep '/' |awk '$4 > 25000'

3、条件表达式:

# awk -F: '$3>300 {print $0}' /etc/passwd# awk -F: '{ if($3>300) print $0 }' /etc/passwd# awk -F: '{ if($3>300) {print $0} }' /etc/passwd# awk -F: '{ if($3>300) {print $3} else{print $1} }' /etc/passwd

4、算术运算:+ - * / %(模) ^(幂 2^3)

可以在模式中执行计算,awk 都将按浮点数方式执行算术运算

# awk -F: '$3 * 10 > 500' /etc/passwd# awk -F: '{ if($3*10>500){print $0} }' /etc/passwd

5、逻辑操作符和复合模式

&& 逻辑与 a&&b|| 逻辑或 a||b! 逻辑非 !a
# awk -F: '$1~/root/ && $3<=15' /etc/passwd# awk -F: '$1~/root/ || $3<=15' /etc/passwd# awk -F: '!($1~/root/ || $3<=15)' /etc/passwd

6、范围模式

# awk '/Tom/,/Suzanne/' filename

示例

1、统计系统给用户数

2、统计用户名为4个字符的用户

3、自定义变量。查询root用户

4、获得网卡IP(出ipv6以外的所有IP)


处理 字段 文本 输出 变量 示例 空格 一行 模式 表达式 文件 分隔符 动作 字符 用户 运算 内容 函数 数据 逻辑 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 为想互联网科技 安徽鑫晟辉互联网科技 壹账通互联网科技 米客互联网科技 奔汉互联网科技 互联网科技美容 互联网 新科技 佩信高科技互联网 恒生科技互联网指数分析 富国互联网科技创新基金 中化能源互联网科技招聘 移动互联网年度科技创新 洛阳昕诺飞互联网科技有限公司 链环科技传统企业怎么转型互联网 互联网金融科技展 长沙茂晟互联网科技有限公司 世界互联网领先科技成果获奖 互联网方面的科技前沿 广州富喜互联网络科技 安徽九吞吴互联网科技有限公司 互联网科技公司发展 互联网 科技创业 火传媒上海互联网科技 宁夏众和广鑫互联网科技有限公司 广州新华互联网科技学校电竞方面 中科明德北京互联网科技 上海科技产业互联网平台 上海京穆互联网科技有限公司 宁波跨境商互联网科技有限公司 上海同邻互联网科技有限公司规模
0