【linux】awk命令详解

前言

awk是一种文本处理工具,可以用于从文本文件中提取和操作数据。它可以对文本进行分割、过滤、排序、计算等操作。awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

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

Awk是开发者Aho、Weinberger和Kernighan名字的缩写。

语法讲解

AWK Operations: 操作说明

  • 一行一行扫描文件
  • 将每个输入行拆分为字段
  • 将输入行/字段与模式进行比较
  • 在匹配的行上执行操作

Useful For:使用场景

  • 转换数据文件
  • 生成格式化的报告

Programming Constructs:编程结构

  • 格式化输出行
  • 算术运算和字符串操作
  • 条件句和循环

Syntax:语法

awk options 'selection_criteria {action}' input-file > output-file
  1. options 选项
  2. selection_criteria 模式匹配表达式
  3. action 对选定行执行的操作
  4. input-file 输入文件
  5. output-file 输出文件

options

选项描述
-i直接修改输入文件
-f从文件中读取awk脚本
-o指定输出文件
-v定义一个变量并赋值
-F指定字段分隔符,默认是空格或制表符

Sample Commands :一些编程的例子

考虑text.txt作为输入文件,文件内容如下:

ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
deepak clerk sales 23000
sunil peon sales 13000
satvik director purchase 80000 

awk 默认行为

默认情况下,awk打印指定文件中的每一行数据。执行命令:

awk '{print}' test.txt

Output:

ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
deepak clerk sales 23000
sunil peon sales 13000
satvik director purchase 80000 

在上面的例子中,没有给出模式。因此,这些操作适用于所有行。默认情况下,不带任何参数的打印操作将打印整行,因此它将打印文件的所有行而不会失败。

打印与给定模式匹配的行

awk命令打印出所有与'manager'匹配的行。执行命令:

awk '/manager/ {print}' test.txt 

Output:

ajay manager account 45000
varun manager sales 50000
amit manager account 47000 

将行拆分为字段

对于每个记录(即行),awk命令默认情况下将以空白字符分隔的记录拆分并将其存储在$n变量中。如果该行有4个字,则分别存储在$1, $2, $3和$4中。另外,$0表示整行。命令如下:

awk '{print $1,$4}' test.txt 

Output:

ajay 45000
sunil 25000
varun 50000
amit 47000
tarun 15000
deepak 23000
sunil 13000
satvik 80000 

awk的内置变量

awk的内置变量包括字段变量—$1、$2、$3等(其中,$0代表整行),将一行文本分解为单独的单词或片段(称为字段)并存储在这些内置变量当中。

  • $0:表示整个当前行的内容。

  • $1, $2, $3……:表示当前行的第1、2、3……个字段。

  • NF:表示当前行的字段数。

  • NR:表示已经读入的记录数(即行数)。

  • FNR:表示当前文件中已经读入的记录数,与NR不同的是,它是针对每个文件的。

  • FS:表示输入字段分隔符,默认为空格或制表符。

  • RS:表示输入记录分隔符,默认为换行符。

  • OFS:表示输出字段分隔符,默认为空格。

  • ORS:表示输出记录分隔符,默认为换行符。

  • ARGC:表示命令行参数个数。

  • ARGV:表示命令行参数数组。

  • FILENAME:表示当前文件名。

  • IGNORECASE:如果设置为1,则匹配时忽略大小写。

  • CONVFMT:表示数字转换格式,默认为%.6g。

  • ENVIRON:表示环境变量数组。

  • PROCINFO:表示awk的一些内部信息,例如版本号、实现方式等。

使用NR内置变量

显示所有行的行号,命令如下:

awk '{print NR,$0}' test.txt 

Output:

1 ajay manager account 45000
2 sunil clerk account 25000
3 varun manager sales 50000
4 amit manager account 47000
5 tarun peon sales 15000
6 deepak clerk sales 23000
7 sunil peon sales 13000
8 satvik director purchase 80000

使用NF内置变量

命令如下:

awk '{print $1,$NF}' test.txt 

Output:

ajay 45000
sunil 25000
varun 50000
amit 47000
tarun 15000
deepak 23000
sunil 13000
satvik 80000

在上面的例子中,$1表示Name,$NF表示Salary。我们可以使用$NF获得Salary,其中$NF表示最后一个字段。

使用NR内置变量显示特定行的内容

命令如下:

awk 'NR==3, NR==6 {print NR,$0}' test.txt 

Output:

3 varun manager sales 50000
4 amit manager account 47000
5 tarun peon sales 15000
6 deepak clerk sales 23000 

使用$1显示第一个字段

命令如下:

awk '{print $1 }' test.txt 

Output:

ajay
sunil
varun
amit
tarun
deepak
sunil
satvik

显示第二个字段为manager的行

命令如下:

awk '$2=="manager" {print $0}' test.txt

Output:

ajay manager account 45000
varun manager sales 50000
amit manager account 47000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值