Linux教程
Linux目录
Linux命令
Linux用户
Linux文件
Linux进程
Linux查询
Linux I/O
Linux正则
Linux安全
Linux shell
Linux网络
Linux VI
Linux 系统命令
Linux 其他

Linux Awk命令

Awk命令用法

Awk 是一种通用脚本语言,旨在用于高级数据处理和报告生成。 awk脚本语言被广泛用作报告和分析工具包。与各种程序性编程语言不同,awk是数据驱动的。这意味着用户可以定义一组操作以对输入文本执行任务。
Awk命令不需要编译,并且允许用户使用变量,字符串函数,数字函数和逻辑运算。它将数据作为输入,执行相应的操作,然后将结果作为标准输出发送回去。
Awk是一种实用程序,可让程序员编写小的但令人印象深刻的程序作为定义文本模式的语句。定义的文本模式应该能够在文档的每一行中进行搜索,并且当在一行中找到匹配项时,将应用操作。
awk命令被广泛用于模式扫描和处理。它在系统中搜索一个或多个文件,并检查它们是否包含指定的模式。如果指定的模式在文件中匹配,它将执行相应的操作。

其名称如何变为awk?

该脚本语言的名称在awk上变为awk。 1977年写原始版本的三个人的字母表的基础。这些人是 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 。这三个人来自AT&T贝尔实验室Unix万神殿。在1977年最初的awk版本之后,此后awk的其他贡献也不断发展。
Awk是一种完整的脚本语言和一个完整的文本处理工具包,可从命令行处理文本文件。

我们可以使用awk命令执行什么操作?

使用awk命令,我们可以执行以下活动:
1 。 Awk操作:
我们可以逐行扫描文件。 如果在行中找到匹配项,则执行操作 我们可以将每个输入行拆分为多个字段。 在输入行/字段之间进行压缩以形成图案
2、适用于:
生成格式化的报告 转换数据文件
3、编程结构:
算术和字符串运算 格式化输出行 应用条件和循环

awk的规则,模式和操作

有一些 规则,模式 和 动作 ,以编写 awk 命令。每个awk命令都由模式和动作组成。该操作是在与输入模式匹配的文本上执行的,并且该模式包含在大括号( {} )中。在awk命令中将模式和动作一起使用时,这称为规则。每个awk程序都用单引号(')编写。
pattern { action }
pattern { action }
. . .
当规则不包含任何模式时,将整个记录(行)视为已匹配。我们甚至可以输入多个在使用中的语句,并且每个语句之间用分号(; )或换行符分隔。如果规则中没有任何操作,默认情况下,它将打印整个记录。

常用的awk语句。

awk命令,包括输入,条件,表达式,输出语句等。但是,最常用的awk语句是:
退出: : 它将停止执行完整的程序并退出cmd窗口。 下一个: 它将停止当前记录处理,并移至下一个要处理的输入数据。 打印: 它打印字段,变量,记录和其他自定义文本。 printf: : 它可以为用户提供对 C 和 bash 等输出格式的更多控制。
注释(#): : 任何句子或程序都写在井号(#)之后,直到结束为止,都被认为是评论。注释仅用于用户理解该行或作为提示,它在awk命令执行中不起作用。
反斜杠(\): 反斜杠( \ )键,我们可以将任何长行分成多行。
让我们看一个简单的awk命令来打印字符串:
只需在控制台上键入以下awk命令,然后按Enter。
$ awk '{print "Welcome to awk command"}'

Awk命令用法
在上述命令中, print 语句仅在屏幕上显示给定的字符串" Welcome to awk command"。用双引号(" )括起来的语句代表一个字符串值,该字符串值将在屏幕上显示出来。

Awk特殊字段标识符

特殊字段标识符返回在提到的标识符位置可用的值。几个特殊字段标识符代表一行中的特定字段和数据位置。
$ 0 : 代表记录的整个行。 $ 1 : 代表一行的第一个字段。 $ 2 : 代表行的第二个字段。 $ 5 : 代表行的第五个字段。 $ 15 : 代表第15行。 $ NF : 它表示"字段数",代表该行的最后一个字段。
考虑一个" txt"文件" awk_file.txt",其中包含以下语句: " Awk是一种通用脚本语言,旨在用于高级数据处理和报告生成 。"现在,使用awk特殊字段标识符,我们将检索相应的值。

在命令屏幕中输入文本文件

在从文件中操作和读取数据之前,我们必须在命令屏幕上输入此文件。首先,我们在命令中输入文本文件" awk_file.txt"以从中检索值。要输入文件,请使用命令:
cat file_name
as
cat awk_awk.txt 

Awk命令用法
在上述命令中, /home/jtp1234 是存在文本文件" awk_file.txt"的目录结构。现在,要使用awk特殊字段标识符和语句 print 从文本文件中读取和打印值,请使用以下命令:
awk '{print $1, $4, $6}' awk_file.txt

Awk命令用法
以上命令 print 语句打印位于" awk_file.txt"中位置1 st ($ 1),位置4 th ($ 4)和位置6 ($ 6)的数据文件。如果要打印文件最后(结尾)位置上可用的数据,请使用标识符 $ NF 。查看下面的命令,该命令打印文件最后位置的可用数据:
 awk '{print $NF}' awk_file.txt

Awk命令用法

特殊模式BEGIN和END规则。

Awk包含两个特殊的模式,称为 BEGIN 和 END 。 BEGIN 规则执行一次,然后对该命令执行任何操作。它会在awk读取任何文本文件之前运行。对记录执行完整的操作后,将执行 END 规则。我们可以在命令中使用多个BEGIN和END规则,它们将按照定义的顺序依次执行。
例如: 让我们在开头和" Process"处打印" Process Starting"字符串。文本文件" awk_file.txt"末尾的"结束"。
awk 'BEGIN { print "Start Processing" } {print $0} END { print "End Processing." }' awk_file.txt

Awk命令用法
如果awk脚本程序仅包含BEGIN模式,则将执行一个动作,输入将不会继续。
Awk命令用法
如果是awk程序仅包含END模式,它仅在执行规则操作之前继续输入。
Awk命令用法

Awk内置变量

Awk具有多个内置变量,这些变量包含有关文件的信息,并允许我们控制程序的执行。以下是一些最常用的内置awk变量:
NF -包含文件(或记录)中的字段数。 NR -包含许多当前行(或记录)。 文件名-包含当前正在使用的输入文件的名称。 FS -用于字段分隔符。 RS -用于记录分隔符。 OFS -用于输出字段分隔符。 ORS -用于输出记录分隔符。
让我们看一个示例,以打印当前正在使用的文件名以及其中可用的总行数:
awk 'END { print "File", FILENAME, "contains", NR, "lines." }' awk_file.txt

Awk命令用法

Awk内置函数

Awk包含几个内置函数,我们可以在程序中使用和调用它们。我们可以使用这些内置的乐趣命令外壳程序和脚本程序的功能。下面提供了一些内置的awk函数:
数值函数: 数值函数可用于诸如int(),atan2(),sin()和rand()之类的数字。 字符串函数: 这些函数用于字符串操作,例如match()用于字符串匹配,split()用于字符串拆分和sprint()。 时间功能: 时间功能用于处理时间戳。 I/O功能: I/O功能处理文件和Shell命令。 按位函数: : 用于执行按位操作。 调用内置的: 它定义了如何调用内置的awk函数。 类型函数: 类型函数用于显示时间信息。 I18N函数: 这些函数用于字符串翻译。
查看在命令外壳中调用awk函数的基本方法。在示例中,我们将使用一些数字函数。

Awk数字函数:

以下是与之一起使用的所有内置数字函数的列表。数字。传递额外的参数并将其括在方括号([])中。
int(x): 将最接近的整数值返回给x,该整数值介于0(零)和x之间。 sqrt(x): 返回x的正平方根值。 sin(x): 返回x的正弦值。 cos(x): 返回x的余弦值。 exp(x): 返回x(e ^ x)的指数值;如果x超出范围,则会产生错误。 x的范围取决于设备的浮点表示形式。 log(x): 返回x的自然对数值(如果x为正数,否则返回NaN("非数字"))。 atan2(y,x): 以弧度返回y/x的反正切值。 rand(): 返回一个随机数。 rand()函数的值平均分配在零和一之间。
awk数值函数示例:
使用 int()函数打印整数:
awk ' { print int(4.6), int(-3), int(15)}'

Awk命令用法
使用 sqrt()计算100的平方根功能:
awk ' { print sqrt(100)}'

Awk命令用法
使用 sin()打印正弦值>功能:
awk ' { print sin(45)}'

Awk命令用法
使用 cos()打印余弦值>功能:
awk ' { print cos(45)}'

Awk命令用法
使用 exp()打印指数值>功能:
awk ' { print exp(10)}'

Awk命令用法
使用 log()打印对数值>功能;如果输入值为负,则通过显示nan来报告警告。
awk ' { print exp(-10)}'

Awk命令用法
使用 atan2()打印反正切值>功能。函数 atan2()返回给定值的反正切。在此命令中,我们计算出0(零)和-1的反正切值,等于恒定的数学PI。
awk '{print atan2(0,-1)}'

Awk命令用法
使用 rand(0 )功能。 rand()函数的值平均分配在零和一之间。
Awk命令用法

Awk脚本

如果您在使用命令行时遇到困难,尤其是对于较长的程序(命令)而言,并且熟悉传统的脚本程序,则可以进行迁移您的脚本命令awk命令。
在我们的脚本示例中,我们将执行以下所有操作:
要确认外壳程序哪些可执行文件用于运行脚本。 使用FS字段分隔符变量读取输入文件并分隔使用冒号(:)分隔的字段。 OFS(输出字段分隔符)使用冒号(:)分隔输出结果中的字段。 初始化计数器并将其设置为0(零)。 将每行文本的第二个字段$ 2 =""设置为空白。 显示带有修改后的第二个字段的输出行。 增加先前设置的计数器值。 打印计数器的值。
awk BEGIN规则完成初始步骤,而END规则返回一个计数器值。另一方面,中间规则没有名称,也没有模式,因此它匹配每一行并修改第二个字段并增加计数器。
Awk命令用法
我们提供以下脚本作为文本,以便您可以复制并粘贴到程序中并执行:
#!/usr/bin/awk-f
BEGIN {
  # set the input and output field separators
  FS=":"
  OFS=":"
  # zero the accounts counter
  accounts=0
}
{
  # set field 2 to nothing
  $2=""
  # print the entire line
  print $0
  # count another account
  accounts++
}
END {
  # print the results
  print accounts " accounts.\n"
}
将上面的脚本另存为 omit.awk 文件,并通过使用chmod键入以下命令来执行此脚本,如下所示:
chmod +x omit.awk

Awk命令用法
现在,我们运行此脚本并传递/etc/passwd 文件添加到脚本。 " passwd" 文件将继续执行omit.awk脚本。
./omit.awk /etc/passwd

Awk命令用法
脚本文件继续进行并打印并显示每行,如下所示:
Awk命令用法
让我们看看另一个使用表达式和控制流语句来处理示例打印从1到5的平方数:
Awk命令用法
如果您觉得难以阅读,编写和理解如上所述的单行命令,您可以创建一个单独的长脚本程序,然后在awk命令中执行该程序。
让我们看看如何将上述方形打印命令写入脚本程序中并在命令中使用。将以上程序编写为脚本程序,并保存到 program.awk 文件。
program.awk
BEGIN { 
  i = 1
  while (i <= 5) { 
    print "square of", i, "is", i*i; 
    ++i 
  } 
}
执行上述脚本,绕过文件名 program.awk 到awk解释器:
awk-f program.awk

Awk命令用法
我们还可以通过以下方式将awk脚本程序作为可执行程序运行: 使用指令并设置awk解释器:
program2.awk
#!/usr/bin/awk-f
BEGIN { 
  i = 1
  while (i < 6) { 
    print "Square of", i, "is", i*i; 
    ++i 
  } 
}
将上面的脚本文件另存为 program2.awk ,然后执行以下命令以运行该程序:
chmod +x program2.awk
./program2.awk

Awk命令用法

其他一些awk命令:

请考虑一个包含以下数据的文本文件" employee.txt",我们将在其中应用一些awk命令并对其进行操作。
employee.txt
John Manager Account 48000
Michel Content Developer 35000
Ashutosh Content Developer 30000
James Manager Sales 50000
Akash Software Developer 40000
John Manager Marketing 45000
Mike Product Manager 40000
1、打印文件:
awk命令的默认行为是从输入文件中打印记录的每一行。
awk '{print}' employee.txt

Awk命令用法
输出
John Manager Account 48000
Michel Content Developer 35000
Ashutosh Content Developer 30000
James Manager Sales 50000
Akash Software Developer 40000
John Manager Marketing 45000
Mike Product Manager 40000
2、打印与输入数据匹配的行:
Awk命令以打印与"内容"单词匹配的所有行。
awk '/Content/ {print}' employee.txt

Awk命令用法
输出
Michel Content Developer 35000
Ashutosh Content Developer 30000
3、打印所有与输入数据不匹配的行:
Awk命令以打印与输入数据"内容"字不匹配的所有行。
awk '!/Content/ {print}' employee.txt

Awk命令用法
输出
John Manager Account 48000
James Manager Sales 50000
Akash Software Developer 40000
John Manager Marketing 45000
Mike Product Manager 40000
4、将行拆分为字段:
当默认情况下,空白字符匹配时,awk命令将其记录拆分为每行并将其存储在$ n变量中。例如,一行包含五个单词,awk将每个记录分别存储在$ 1,$ 2,$ 3,$ 4和$ 5中。整行代表$ 0。让我们分割分别表示名称和薪水字段的$ 1和$ 4处的行和打印值。
awk '{print $1,$4}' employee.txt

Awk命令用法
输出
John 48000
Michel 35000
Ashutosh 30000
James 50000
Akash 40000
John 45000
Mike 40000
5、 NR内置变量(显示行号)的使用
带有NR内置变量的Awk命令将打印所有行以及行号。
awk '{print NR,$0}' employee.txt

Awk命令用法
输出
1 John Manager Account 48000
2 Michel Content Developer 35000
3 Ashutosh Content Developer 30000
4 James Manager Sales 50000
5 Akash Software Developer 40000
6 John Manager Marketing 45000
7 Mike Product Manager 40000
6、将NF内置变量("显示最后一个字段")一起使用
带有NF内置变量的Awk命令将打印最后一个字段,即记录工资。
awk '{print $1,$NF}' employee.txt 

Awk命令用法
输出
John 48000
Michel 35000
Ashutosh 30000
James 50000
Akash 40000
John 45000
Mike 40000
7、 NR内置变量的另一种用法(显示行从2到5)
awk'NR == 2,NR == 5 {print NR,$ 0}'employee.txt
Awk命令用法
输出
2 Michel Content Developer 35000
3 Ashutosh Content Developer 30000
4 James Manager Sales 50000
5 Akash Software Developer 40000
请考虑另一个文件test.txt,其中包含以下数据。
test.txt
James A12 1
Shiv B6 2
Ratan M42 3 
1)要在test.txt中打印每行的第一项以及用"-"分隔的行号(NR):
awk '{print NR "-" $1 }' test.txt

Awk命令用法
输出
1-James 
2-Shiv    
3-Ratan
2)从test.txt打印第二行/项目:
awk '{print $2}' test.txt

Awk命令用法
输出
A12
B6
M42
3)查找文件中存在的最长行的长度:
awk '{ if (length($0) > max) max = length($0) } END { print max }' test.txt

Awk命令用法
输出
12
4)要计算文件中的总行数:
awk 'END { print NR }' test.txt

Awk命令用法
输出
3

昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4