linux下awk使用实例

linux下awk使用实例 #

Awk 是一种用于处理数据和生成报告的脚本语言。awk命令编程语言不需要编译,并允许用户使用变量、数值函数、字符串函数和逻辑运算符。

Awk 是一个实用程序,它使程序员能够以语句的形式编写微小但有效的程序,这些程序定义要在文档的每一行中搜索的文本模式,以及在一行中找到匹配项时要采取的作。awk 主要用于模式扫描和处理。它会搜索一个或多个文件,以查看它们是否包含与指定模式匹配的行,然后执行关联的作。

Awk 是开发人员名称的缩写 - Aho, Weinberger和 Kernighan. 

awk语法 #

awk 选项 '匹配条件 {操作 }' 输入 > 输出
选项描述
-F自定义分隔符
-f从文件中读取awk程序
'{}'对匹配内容的操作

awk可以做什么?  #

  1. awk操作流程

    • 逐行扫描文件 
    • 将每个输入行拆分为多个字段
    • 将输入行/字段与模式进行比较 
    • 对匹配的行执行作 
  2. awk用途

    • 转换数据文件 
    • 生成格式化报告
  3. 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/