linux下awk使用实例 #
Awk 是一种用于处理数据和生成报告的脚本语言。awk命令编程语言不需要编译,并允许用户使用变量、数值函数、字符串函数和逻辑运算符。
Awk 是一个实用程序,它使程序员能够以语句的形式编写微小但有效的程序,这些程序定义要在文档的每一行中搜索的文本模式,以及在一行中找到匹配项时要采取的作。awk 主要用于模式扫描和处理。它会搜索一个或多个文件,以查看它们是否包含与指定模式匹配的行,然后执行关联的作。
Awk 是开发人员名称的缩写 - Aho, Weinberger和 Kernighan.
awk语法 #
awk 选项 '匹配条件 {操作 }' 输入 > 输出
选项 | 描述 |
---|---|
-F | 自定义分隔符 |
-f | 从文件中读取awk程序 |
'{}' | 对匹配内容的操作 |
awk可以做什么? #
awk操作流程
- 逐行扫描文件
- 将每个输入行拆分为多个字段
- 将输入行/字段与模式进行比较
- 对匹配的行执行作
awk用途
- 转换数据文件
- 生成格式化报告
awk编程结构
- 设置输出行格式
- 算术和字符串运算
- 条件语句和循环
awk命令示例 #
以下为本文 输入文件内容:
$ cat info.txt
朱八 皇帝 客户 45000
阿三 异族 客户 25000
赵大 皇帝 售出 50000
李二凤 皇帝 客户 47000
增阿牛 侠客 售出 15000
张三 盲流 售出 23000
三毛 狗 售出 13000
二狗 猫 购入 80000
打印所有行(默认操作) #
默认情况下,Awk 会打印指定文件中的每一行数据。
$ awk '{print}' info.txt
### 输出
朱八 皇帝 客户 45000
阿三 异族 客户 25000
赵大 皇帝 售出 50000
李二凤 皇帝 客户 47000
增阿牛 侠客 售出 15000
张三 盲流 售出 23000
三毛 狗 售出 13000
二狗 猫 购入 80000
在上面的示例中,没有指定匹配条件。因此,print
操作适用于所有行。默认情况下,不带任何参数的print操作会打印整行,因此它会打印文件的所有行而不会失败。
关键字搜索行 #
$ awk '/客户/ {print}' info.txt
## 输出
朱八 皇帝 客户 45000
阿三 异族 客户 25000
李二凤 皇帝 客户 47000
在上面的例子中,awk 命令打印所有与 ‘客户’ 匹配的行。
打印特定列 #
对于每条记录(即行),awk命令默认拆分为以空格字符为分隔符的记录,并将其存储在$n
变量中。如果该行有 4 个字,它将分别以 $1
、$2
、$3
和 $4
存储。此外,$0
表示整行。
$ awk '{print $1,$4}' info.txt
## 输出
朱八 45000
阿三 25000
赵大 50000
李二凤 47000
增阿牛 15000
张三 23000
三毛 13000
二狗 80000
在上面的示例中,$1
和 $4
分别表示 姓名
和 战力
字段。
Awk的内置变量 #
Awk的内置变量包括字段变量 — $1
、$2
、$3
等($0
是整行),这些变量将一行文本分成单独的单词或片段,称为字段。
NR NR表示输入记录数量的当前计数。请记住,记录通常是行。awk 命令对文件中的每条记录执行一次 pattern/action 语句。
NF NF 表示保留当前输入记录(行)中的字段数。
FS FS表示 字段 分隔符,用于划分输入行上的字段。默认值为 “white space”,表示
空格
和tab字符
。FS 可以重新分配给另一个字符(通常在 BEGIN 中)以更改字段分隔符。RS RS表示当前 记录 分隔符。由于默认情况下记录是行,因此默认记录分隔符是 换行符。
OFS
OFS表示输出字段分隔符,当 Awk 打印字段时,它会分隔字段。默认值为空格。每当 print 有多个参数用逗号分隔时,它将在每个参数之间打印 OFS 的值。
ORS
ORS表示输出记录分隔符,当 Awk 打印输出行时,它会分隔输出行。默认值为换行符。print 会自动在提供给 print 的任何内容的末尾输出 ORS 的内容。
NR使用示例(显示行号) #
$ awk '{print NR,$0}' info.txt
## 输出
1 朱八 皇帝 客户 45000
2 阿三 异族 客户 25000
3 赵大 皇帝 售出 50000
4 李二凤 皇帝 客户 47000
5 增阿牛 侠客 售出 15000
6 张三 盲流 售出 23000
7 三毛 狗 售出 13000
8 二狗 猫 购入 80000
在上面的示例中,带有 NR 的 awk 命令打印所有行以及行号。
NF使用示例(显示最后字段) #
$ awk '{print $1,$NF}' info.txt
## 输出
朱八 45000
阿三 25000
赵大 50000
李二凤 47000
增阿牛 15000
张三 23000
三毛 13000
二狗 80000
在上面的示例中,$1 表示名称,$NF 表示战力。我们可以使用 $NF 来获取战力,其中 $NF 表示最后一个字段。以上命令和awk '{print $1,$4}' info.txt
同一效果。
另一个NR使用示例 (显示第三到第六行) #
$ awk 'NR==3, NR==6 {print NR,$0}' info.txt
## 输出
3 赵大 皇帝 售出 50000
4 李二凤 皇帝 客户 47000
5 增阿牛 侠客 售出 15000
6 张三 盲流 售出 23000
NR==3, NR==6
是一个范围模式,表示处理从第3行(NR==3)到第6行(NR==6)的记录,{print NR,$0}
对符合范围的行执行的动作,print NR
打印当前行号,$0代表整行。
更多awk使用实例 #
打印行号和第一项内容并用-
连接
#
$ awk '{print NR "-" $1}' info.txt
1-朱八
2-阿三
3-赵大
4-李二凤
5-增阿牛
6-张三
7-三毛
8-二狗
输出第二项(列)内容 #
$ awk '{print $2}' info.txt
皇帝
异族
皇帝
皇帝
侠客
盲流
狗
猫
打印任何非空行(如果存在) #
awk 'NF < 0' info.txt
awk 'NF == 0 {print NR}' info.txt
awk 'NF <= 0 {print NR}' info.txt
查找文件中最长行的长度 #
$ awk '{ if (length($0) > max) max = length($0) } END { print max }' info.txt
15
length($0)
表示使用内置函数length
来判断当前行长度。
计算文件中的行数 #
$ awk 'END { print NR }' info.txt
8
打印字符超过14的行 #
$ awk 'length($0) > 14' info.txt
李二凤 皇帝 客户 47000
增阿牛 侠客 售出 15000
二狗 猫 购入 80000
按条件筛选具体数据 #
$ awk '{ if($2 == "侠客") print $0;}' info.txt
增阿牛 侠客 售出 15000
打印1到9的平方数 #
$ awk 'BEGIN { for(i=1;i<=9;i++) print i,"的平方是",i*i; }'
1 的平方是 1
2 的平方是 4
3 的平方是 9
4 的平方是 16
5 的平方是 25
6 的平方是 36
7 的平方是 49
8 的平方是 64
9 的平方是 81
结论 #
AWK命令是一个非常简单但非常有用的实用程序,适用于您正在处理的任何文本文件、日志或命令行数据。无论是初学者还是老手系统管理员,AWK 都可以帮助您即时有效地搜索、过滤和格式化数据,让您的生活更轻松。
使用 AWK,您不必编写冗长的脚本。单行代码可以产生员工工资、删除日志,甚至吐出快速报告。它具有模式感知功能,可将行分成多个字段,并允许您执行打印、计数、计算和格式化等操作。
AWK 可以节省时间,防止人为错误,并提高 Linux 平台上的生产力。
原文地址 https://www.geeksforgeeks.org/awk-command-unixlinux-examples/