前言
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
- options 选项
- selection_criteria 模式匹配表达式
- action 对选定行执行的操作
- input-file 输入文件
- 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