提升效率必备!学习awk命令,轻松搞定数据

news2024/9/20 8:37:22

在日常的工作中,无论是数据处理、日志分析,还是格式化输出,AWK命令都是不可或缺的利器。AWK是一种强大的文本处理工具,能让你轻松处理复杂的数据,提升工作效率。本文将为你介绍AWK的基本功能及一些实用场景,帮助你快速掌握这门工具。

awk选项

awk 命令的使用方式如下:

awk options program file

awk 可以采用以下选项:

  • -F:fs指定文件分隔符。
  • -f:文件指定包含 awk 脚本的文件。
  • -vvar=值声明变量。

我们将了解如何使用awk处理文件和打印结果。

读取AWK脚本

要定义awk脚本,请使用用单引号括起来的大括号,如下所示:

awk '{print "Welcome to awk command tutorial "}'

如果您键入任何内容,它将返回我们提供的相同欢迎字符串。如下图所示:

要终止程序,请按Ctrl+D。看起来很棘手,不要惊慌,最好的还没有到来。

使用变量

使用awk,可以处理文本文件。Awk为找到的每个数据字段分配一些变量:

  • $0:是输出整行的内容。

  • $1:是输出第一个字段。

  • $2:是输出第二个字段。

  • $n:表示第n个字段。

在awk中,空格制表符等空白字符是字段之间的默认分隔符。看看这个例子,看看awk是如何处理它的:

上面的示例打印了每行的第一个单词。

有时某些文件中的分隔符不是空格或tab,而是其他内容。您可以使用–F选项指定它:

awk -F ':' '{print $1}' /etc/passwd

此命令将打印passwd文件中的第一个字段。我们使用冒号作为分隔符,因为passwd文件使用它。

使用多个命令

要运行多个命令,请用分号分隔它们,如下所示:

root@didiplus:~# echo "Hello Tom" | awk '{$2="Adam"; print $0}'
Hello Adam

第一个命令使 $2字段等于Adam。第二个命令打印整行。

从文件中读取脚本

您可以在文件中键入awk脚本,并使用 -f 选项指定该文件。我们的文件包含以下脚本:

{print $1 " home at " $6}
 awk -F: -f testfile /etc/passwd

在这里,我们从 /etc/passwd打印用户名和他的主路径,当然分隔符是用大写的-F指定的,即冒号。

你可以像这样awk脚本文件:

{
text = $1 " home at " $6
print text  
}

awk预处理

如果您需要为结果创建标题或表头等。您可以使用BEGIN关键字来实现此目的。它在处理数据之前运行:

awk 'BEGIN {print "this Title"} {print $0}' myfile

执行上述代码输入如下图的结果:

awk后处理

要在处理数据后运行脚本,请使用END关键字:

awk 'BEGIN {print "this Title"} {print $0} END {print "this footer"}' myfile

执行上述代码输出如下图的结果:

这很有用,例如,您可以使用它来添加页脚。让我们将它们组合到一个脚本文件中:

BEGIN {
print "Users and thier corresponding home"
print " UserName \t HomePath"
print "___________ \t __________"
FS=":"
}
{
print $1 "  \t  " $6
}
END {
print "The end"
}

首先,使用BEGIN关键字创建顶部部分。然后我们定义FS并在末尾打印页脚。

 awk -f myscript  /etc/passwd

内置变量

我们看到数据字段变量$1$2$3等用于提取数据字段,我们还处理字段分隔符FS

但这些并不是唯一的变量,还有更多的内置变量。

下面列出了一些内置变量:

  • FIELDWIDTHS:指定字段宽度。

  • RS:指定记录分隔符。

  • FS:指定字段分隔符。

  • OFS:输出分隔符。

  • ORS:输出分隔符。

默认情况下,OFS变量是空格,你可以设置OFS变量来指定你需要的分隔符:

awk 'BEGIN {FS=":";OFS="---"} {print $1,$6,$7}' /etc/passwd

有时,字段的分布没有固定的分隔符。在这些情况下,FIELDWIDTHS 变量可以解决问题。

假设我们有以下内容:

1235.96521
927-8.3652
36257.8157
awk 'BEGIN{FIELDWIDTHS="3 4 3"}{print $1,$2,$3}' testfile

查看输出。输出字段为每行3个,每个字段长度都基于我们由FIELDWIDTH分配的字段。

更多的变量

还有一些其他变量可以帮助你获取更多信息:

  • ARGC:获取传递的参数数量。

  • ARGV:获取命令行参数。

  • ENVIRON :shell环境变量及其对应值的数组

  • FILENAME: awk处理的文件名。

  • NFFields正在处理的行数。

  • NR:检索处理过的记录总数。

  • FNR:被处理的记录。

  • IGNORECASE:忽略字符的大小写。

让我们测试一下。


root@didiplus:~#  awk 'BEGIN{print ARGC,ARGV[1]}' myfile
2 myfile

ENVIRON变量检索shell环境变量,如下所示:

root@didiplus:~# awk 'BEGIN {print ENVIRON["PATH"]}'
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

您可以使用不带ENVIRON变量的 bash 变量,如下所示:

root@didiplus:~# echo | awk -v home=$HOME '{print "My home is" home}'
My home is/root

NF变量指定记录中的最后一个字段,但不知道其位置:

awk 'BEGIN{FS=":"; OFS=":"} {print $1,$NF}' /etc/passwd

如果像这样键入NF变量,则可以将其用作数据字段变量:$NF

让我们看一下这两个例子来了解FNRNR变量之间的区别:

awk 'BEGIN{FS=","}{print $1,"FNR="FNR}' myfile myfile

在此示例中,awk命令定义两个输入文件。相同的文件,但处理了两次。输出是第一个字段值和FNR变量。

现在,检查NR变量并查看差异:

$ awk '
BEGIN {FS=","}
{print $1,"FNR="FNR,"NR="NR}
END{print "Total",NR,"processed lines"}' myfile myfile

当涉及到第二个文件时,FNR变量变为1,但NR变量保留其值。

用户自定义变量

变量名称可以是任何内容,但不能以数字开头。您可以像在shell脚本中一样分配变量,如下所示:

awk '
BEGIN{
test="Welcome to LikeGeeks website"
print test
}'

执行上述命令后,输出如下结果:

结构化命令

if循环

awk脚本语言支持if条件语句。testfile包含以下内容:

10
15
6
33
45
root@didiplus:~# awk '{if ($1 > 30) print $1}' testfile
33
45

如果要运行多个语句,则应使用大括号:

root@didiplus:~# awk '{
if ($1 > 30)
{
x = $1 * 3
print x
}
}' testfile
99
135

您可以使用如下所示的else语句:

root@didiplus:~# awk '{
if ($1 > 30)
{
x = $1 * 3
print x
} else
{
x = $1 / 2
print x
}}' testfile
5
7.5
3
99
135

或者在同一行中键入它们,并用分号分隔 if 语句,如下所示:

root@didiplus:~# awk '{ if ($1>20) print $1*2;else print $1/2}' testfile
5
7.5
3
66
90

while循环

您可以使用while循环遍历具有条件的数据。

awk '{
sum = 0
i = 1
while (i < 5)
{
sum += $i
i++
}

average = sum / 3
print "Average:",average
}' testfile
  • $i:是取到testfile的每一列的值
  • while循环运行,每次它都会向sum变量加$i的值,直到 i 变量变为 4。

您可以使用break命令退出循环,如下所示:

awk '{
sum = 0
i = 1
while (i < 5)
{
sum += $i
if (i == 3) 
break
i++
}
average = sum / 3
print "Average:",average
}' testfile

结果还是和上面的输出的一样。

for循环

awk脚本语言支持for循环:

awk '{
total = 0
for (var = 1; var < 5; var++)
{
total += $var
}
avg = total / 3
print "Average:",avg

}' testfile

格式化打印

awk中的printf命令允许你使用格式说明符打印出格式化的输出。

格式说明符如下所示:

%[modifier]control-letter

下面列出了可用于printf的格式说明符:

  • c:以字符串的形式打印数值输出。

  • d:打印一个整数值。

  • e:打印科学数字。

  • f:打印浮点数。

  • o:打印一个八进制值。

  • s:打印文本字符串。

这里我们使用printf来格式化输出:

awk 'BEGIN{
x = 100 * 100
printf "The result is: %e\n", x
}'

内置函数

Awk提供了几个内置函数,例如:

数学函数

如果你喜欢数学,你可以在awk脚本中使用这些函数:

  • sin(x)

  • cos(x)

  • sqrt(x)

  • exp(x)

  • log(x)

  • rand()

而且它们可以正常使用:

root@didiplus:~# awk 'BEGIN{x=exp(5); print x}'
148.413

字符串函数

有很多字符串函数,你可以查看列表,但我们将其中一个作为示例来研究,其余的都是一样的:

root@didiplus:~# awk 'BEGIN{x = "likegeeks"; print toupper(x)}'
LIKEGEEKS

函数 toupper将传递的字符串的字符大小写转换为大写。

用户自定义函数

您可以定义您的函数并像这样使用它们:

awk '
function myfunc()
{
printf "The user %s has home path at %s\n", $1,$6
}

BEGIN{FS=":"}
{
myfunc()
}' /etc/passwd

在这里,我们定义了一个名为myprint的函数,然后在脚本中使用它通过printf函数打印输出。

总结

AWK是一款功能强大的数据处理工具,它能够高效地处理复杂的文本文件和数据集。无论你是需要处理日志、统计数据,还是生成格式化的报表,AWK都能轻松胜任。通过熟练掌握AWK命令,你可以极大提升工作效率,轻松应对各种数据处理任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2116629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

树 --- 二叉树

树的物理结构和逻辑结构上都是树形结构。 树形结构&#xff1a;由一个根和若干个子节点组成的集合。 最外围的为叶子节点&#xff1a;只有前驱而没有后继。 &#xff08;一&#xff09;树的性质 • ⼦树是不相交的 • 除了根结点外&#xff0c;每个结点有且仅有⼀个⽗结点 •…

每天五分钟玩转深度学习框架PyTorch:将nn的神经网络层连接起来

本文重点 前面我们学习pytorch中已经封装好的神经网络层,有全连接层,激活层,卷积层等等,我们可以直接使用。 如代码所示我们直接使用了两个nn.Linear(),这两个linear之间并没有组合在一起,所以forward的之后,分别调用了,在实际使用中我们常常将几个神经层组合在一起…

【EI会议征稿通知】第十一届机械工程、材料和自动化技术国际会议(MMEAT 2025)

第十一届机械工程、材料和自动化技术国际会议&#xff08;MMEAT 2025&#xff09; 2025 11th International Conference on Mechanical Engineering, Materials and Automation Technology 本次大会旨在汇聚全球机械工程、材料科学及自动化技术的创新学者和行业专家&#xff0…

使用 BentoML快速实现Llama-3推理服务

介绍 近年来&#xff0c;开源大模型如雨后春笋般涌现&#xff0c;为自然语言处理领域带来了革命性的变化。从文本生成到代码编写&#xff0c;从机器翻译到问答系统&#xff0c;开源大模型展现出惊人的能力&#xff0c;吸引了越来越多的开发者和企业投身其中。 然而&#xff0…

Subclass-balancing Contrastive Learning for Long-tailed Recognition

文章目录 SCL(supervised contrastive learning)1. 监督对比学习&#xff08;SCL&#xff09;的基本概念2. SCL的损失函数3. 长尾数据集的问题4. k-正样本对比学习&#xff08;KCL&#xff09;的引入5. 总结 SBCL举例说明&#xff1a;狗的分类 关键点&#xff1a;划分为多个子类…

4-1.Android Camera 之 CameraInfo 编码模板(前后置摄像头理解、摄像头图像的自然方向理解)

一、Camera.CameraInfo Camera.CameraInfo 是用于获取设备上摄像头信息的一个类&#xff0c;它提供摄像头的各种详细信息&#xff0c;例如&#xff0c;摄像头的方向、是否支持闪光灯等&#xff0c;以下是它的常用属性 static int CAMERA_FACING_BACK&#xff1a;表示设备的后置…

Protobuf库的使用

文章目录 Protobuf是什么Protobuf使⽤流程介绍ProtoBuf的使用创建.proto⽂件指定proto3语法package声明符定义消息&#xff08;message&#xff09;编译contacts.proto⽂件命令如下&#xff1a;序列化与反序列化的使⽤ Protobuf是什么 ProtoBuf&#xff08;全称ProtocolBuffer…

数字 FPV 革命 – DJI、Leadcore 和 Artosyn 的三角关系。

人们对 DJI、Caddx FPV 以及 HDZero 等公司最近推出的数字 FPV 系统的起源进行了大量的猜测和推测。随着 Avatar 系统的发布&#xff0c;也有许多人认为它要么使用与 DJI 相同的芯片组&#xff0c;要么是复制品或克隆品。在本文中&#xff0c;我将尝试揭开这一切的神秘面纱&…

python spider novel

python msedgedriver 获取小说 声明&#xff1a;只为学习/练习技术 from lxml import etree from selenium import webdriver from selenium.webdriver.edge.service import Service from selenium.webdriver.edge.options import Optionsimport time# 初始化EdgeOptions, 以…

【系统规划与管理师】【案例分析】【考点】【答案篇】第4章 IT服务规划设计

【问题篇】☞【系统规划与管理师】【案例分析】【考点】【问题篇】第4章 IT服务规划设计 【移动端浏览】☞【系统规划与管理师】【案例分析】【模拟考题】章节考题汇总&#xff08;第4章&#xff09;&#xff08;答案篇&#xff09;&#xff08;共38个知识点&#xff09; 第4章…

《数字信号处理》学习05-单位冲击响应与系统响应

目录 一&#xff0c;单位冲激响应 二&#xff0c;LTI系统对任意序列的系统响应 三&#xff0c;LTI系统的性质 通过上一篇文章《数字信号处理》学习04-离散时间系统中的线性时不变系统-CSDN博客的学习&#xff0c;我已经知道了离散时间线性时不变系统&#xff08;LTI&#x…

基于 jenkins 的持续测试方案

CI/CD Continuous Integration; Continuous Deployment; 持续集成&#xff0c;将新代码和旧代码一起打包、构建&#xff1b;持续部署&#xff0c;将新构建的包进行部署&#xff1b;持续测试&#xff0c;将新代码、新单元测试一起测试&#xff1b;方案&#xff1a; 公有云DevO…

Python 控制Chrome浏览器使用Selenium4操作点击百度搜索

前面我们讲到如何安装Selenium和ChromeDriver来驱动打开网页,现在我们有一个目的就是使用python来控制chrome浏览器打开百度并搜索 直接先上调试好的代码 from time import sleepfrom selenium import webdriver from selenium.webdriver.common.keys import Keys from selen…

2-88 基于matlab的四叉树加权聚焦多聚焦图像融合

基于matlab的四叉树加权聚焦多聚焦图像融合&#xff0c;的四叉树分解策略将源图像被分解成四叉树结构中具有最佳尺寸的块。在这个树形结构中&#xff0c;使用一种新的加权焦点测量方法&#xff08;名为加权修正拉普拉斯之和&#xff09;来检测焦点区域。可以很好地从源图像中提…

1934. 数字游戏(number)

代码 #include<bits/stdc.h> using namespace std; int main() {int ans0,i;string s;cin>>s;for(i0;i<7;i)if(s[i]1)ans;cout<<ans;return 0; } 记得点赞关注收藏&#xff01;&#xff01;&#xff01;谢谢&#xff01;&#xff01;&#xff01;

基于huffman树的文件压缩项目以及相关测试

前言 项目采用Huffman编码的方式进行文件压缩与解压缩。主要原理是通过Huffman编码来表示字符&#xff0c;出现次数多的编码短&#xff0c;出现次数少的编码长&#xff0c;这样整体而言&#xff0c;所需要的bit位是减少的&#xff0c;就实现了文件压缩功能。读取文件中的字符出…

基于大语言模型智能体的自主机器学习

文章介绍了MLR-Copilot框架&#xff0c;这是一种利用大型语言模型&#xff08;LLMs&#xff09;来自动化机器学习研究中创意生成、实验设计和实施过程的方法。该框架分为三个阶段&#xff1a; 首先通过阅读现有研究文献&#xff0c;使用LLM驱动的IdeaAgent来生成研究假设和实验…

PADS Router 入门基础教程(一)

有将近三周没有更新过博客了&#xff0c;最近在整理PADS Router 入门基础教程&#xff0c;希望喜欢本系列教程的小伙伴可以点点关注和订阅&#xff01;下面我们开始进入PADS Router课程的介绍。 一、PADS Router 快捷键 ​ 二、课程介绍 本教程主要介绍&#xff1a;PADS Rou…

电脑安装Winserver2016无法安装网卡驱动(解决办法)

因为工作原因&#xff0c;需要找一台PC机作为服务器去测试软件性能问题&#xff0c;故需要在PC机上安装网卡驱动。 电脑品牌&#xff1a;联想 型号&#xff1a;天逸510Pro-18ICB 操作系统&#xff1a;WindowsServer2016&#xff08;桌面版&#xff09; 问题&#xff1a;系统…

连接池-druid

原因&#xff1a;通过jdbc 创建Connection时比较耗费资源和时间&#xff0c;如果程序每次执行数据库操作都自己创建连接&#xff0c;项目不好控制连接数量&#xff0c;另外程序执行相对耗时。 市面上有很多厂商有连接池组件&#xff0c;目前比较出名的是alibaba druid 以及 Hi…