首页 > 系统相关 >Linux三剑客——awk

Linux三剑客——awk

时间:2023-12-23 22:44:07浏览次数:27  
标签:语句 BEGIN string awk Linux print 变量 三剑客

awk命令可以用来的处理数据流,它的作用非常强大,甚至和编程语言一样,甚至实现了条件语句,关联数组等功能。

脚本结构与执行流程

一个典型的awk脚本结构是这样的。

 awk 'BEGIN{   print "start" } pattern { commands } END{ print "end" }' file

这个脚本由三部分组成:

pattern:匹配模式。awk会逐行处理文本,对于能够匹配上pattern的行,会执行公共语句块,也就是实例中的{commands}。

BEGIN:在pattern之前被执行的内容,只执行一次。

END:在pattern之后被执行的内容,也只执行一次。

注意,这三部分都是可选的。

awk的工作流程如下:

(1)首先执行BEGIN { commands } 语句块中的语句。

(2)接着从文件或stdin中读取一行,如果能够匹配pattern,则执行随后的commands语句块。重复这个过程,直到文件全部被读取完毕。

(3)当读至输入流末尾时,执行END { commands } 语句块。

模式是可选的。如果没有提供模式,那么awk就认为所有的行都是匹配的:

 $ echo -e "line1\nline2" | awk 'BEGIN { print "Start" } { print } \
      END { print "End" } '
 Start
 line1
 line2
 End

特殊变量

以下是awk可以使用的一些特殊变量。

  • NR:表示记录编号,当awk将行作为记录时,该变量相当于当前行号。
  • NF:表示字段数量,在处理当前记录时,相当于字段数量。默认的字段分隔符是空格。
  • $0:该变量包含当前记录的文本内容。
  • $1:该变量包含第一个字段的文本内容。
  • $2:该变量包含第二个字段的文本内容。

外部变量

借助选项-v,我们可以将外部值(并非来自stdin)传递给awk:

 

 $ VAR=10000
 $ echo | awk -v VARIABLE=$VAR '{ print VARIABLE }'
 10000

 

还有另一种灵活的方法可以将多个外部变量传递给awk。例如:

 $ var1="Variable1" ; var2="Variable2"
 $ echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2
 Variable1 Variable2

在上面的方法中,变量以键-值对的形式给出,使用空格分隔(v1=$var1 v2=$var2),作为awk的命令行参数紧随在BEGIN、{}和END语句块之后。

过滤

我们可以为需要处理的行指定一些条件:

 

 $ awk 'NR < 5'     # 行号小于5的行
 $ awk 'NR==1,NR==4'     # 行号在1到5之间的行
 $ awk '/linux/'     # 包含模式为linux的行(可以用正则表达式来指定模式)
 $ awk '!/linux/'     # 不包含模式为linux的行

 

读取命令输出

awk可以调用命令并读取输出。把命令放入引号中,然后利用管道将命令输出传入getline:

 "command" | getline output ;

下面的代码从/etc/passwd文件中读入一行,然后显示出用户登录名及其主目录。在BEGIN语句块中将字段分隔符设置为:,在主语句块中调用了grep。

 $ awk 'BEGIN {FS=":"} { "grep root /etc/passwd" | getline; \
      print $1,$6 }'
 root /root

awk的关联数组

除了数字和字符串类型的变量,awk还支持关联数组。关联数组是一种使用字符串作为索引的数组。你可以通过中括号中索引的形式来分辨出关联数组,就像用户定义的简单变量一样,你也可以使用等号为数组元素赋值:

 myarray[index]=value

在awk中使用循环

在awk中可以使用for循环,其格式与C语言中的差不多:

for(i=0;i<10;i++) { print $i ; }

另外awk还支持列表形式的for循环,也可以显示出数组的内容:

for(i in array) { print array[i]; }

awk内建的字符串处理函数

awk有很多内建的字符串处理函数:

  • length(string):返回字符串string的长度。
  • index(string, search_string):返回search_string在字符串string中出现的位置。
  • split(string, array, delimiter):以delimiter作为分隔符,分割字符串string,将生成的字符串存入数组array。
  • substr(string, start-position, end-position):返回字符串string中以start-position和end-position作为起止位置的子串。
  • sub(regex, replacement_str, string):将正则表达式regex匹配到的第一处内容替换成replacment_str。
  • gsub(regex, replacement_str, string):和sub()类似。不过该函数会替换正则表达式regex匹配到的所有内容。

 

标签:语句,BEGIN,string,awk,Linux,print,变量,三剑客
From: https://www.cnblogs.com/xyhj/p/17923782.html

相关文章

  • Ubuntu 上使能 SELinux
    此文档说明如何在ubuntu上启用SELinux,测试环境为虚拟机,开始前一定一定一定先来个快照,不要问我为什么有三个一定。卸载apparmor(可选)ubuntu默认安装的安全组件为apparmor,网上文档说最好卸载掉apparmor,可能冲突之类的问题,说法可能有点有误啊,apparmor和selinux不兼容,当启用s......
  • Linux下解压命令大全
    .tar解包:tarxvfFileName.tar打包:tarcvfFileName.tarDirName(注:tar是打包,不是压缩!)———————————————.gz解压1:gunzipFileName.gz解压2:gzip-dFileName.gz压缩:gzipFileName.tar.gz和.tgz解压:tarzxvfFileName.tar.gz压缩:tarzcvfFileName.tar.gz......
  • Linux Zookeeper在Docker 安装与简单通信
    一、在本地计算机上安装Docker1.安装Docker(安装最新的Docker版本)yuminstalldocker-cedocker-ce-clicontainerd.iodocker-bulidx-plugindocker-compose-plugin2.查看Docker版本并启动Dockerdockerversion安装成功的Docker版本为24.0.6systemctlstartdockerDock......
  • 使用Avalonia跨Linux平台
    https://blog.csdn.net/u012563853/article/details/128020416 Avalonia,读:阿瓦隆尼亚这里的跨平台指的是,使用c#语言开发跨Linux平台。c#在Windows桌面开发中很强,但是在Linux桌面中,不能跨平台,Qt可以在Linux中跨平台,但是那是另外一门语言了。Avalonia类似使用WPF的技术方法来开......
  • Linux操作系统之面试必刷50题
    1、static作用static是一个关键字,在不同的上下文中具有不同的作用。以下是static关键字的几种常见用法和作用:静态变量(StaticVariables):在函数内部使用static关键字声明的变量称为静态变量。静态变量在程序的整个生命周期内都存在,不会随着函数的调用而被销毁。静态变量的作用域......
  • linux内核中的zero-page
    zero-page操作系统给用户新分配的内容(通过mmap或者brk)都是清零过的,但是这些虚拟地址通常都是按需分配物理页面。这里的“按需”的需求可能是读取,也可能是写入。如果只是读取,只要保证读取内容是零即可,在MMU的基础上,可以让“所有”虚拟地址都映射到内容为0的物理页面中。这样如......
  • 深入了解 Linux 网卡和网口:揭秘网络接口的奥秘
    实际工作中,把服务器关机了,网线从一个网口移动到了其他网口,导致再开机后,服务器无法联网了。由于缺少王工的支持,这使我开始关注网络技术。先总结下常用的概念和操作吧。1.网卡和网口的对应关系在Linux系统中,网卡(NetworkInterfaceCard,NIC)与网络接口(网口)之间存在紧密的对应关系。......
  • 按马哥教育关于2023版Linux云计算SRE工程师掌握知识类别,你会了哪些?
    模块1:Linux新手快速基础入门模块2:面试必备-企业级Shell脚本编程实战模块3:Linux系统结构、内核、进程进阶模块4:网络管理管理及互联网通信实战模块5:互联网常见服务应用实战模块6:网络安全、加密及安全通信实战模块7:安全加固内核防火墙Iptables模块8:企业级Web-LA/NMP架......
  • 【Linux】命令实现分卷压缩
    压缩命令#压缩命令:把es-head.tar文件,差分成20m大小的文件,每一部分都以es-head-part-前缀命名split-b20mes-head.tares-head-part-#压缩命令:把testSplit文件夹,压缩拆分成20m大小的文件,每一部分都以testSplit-part-前缀命名tar-czvf-testSplit/|split-b20m-test......
  • Linux磁盘分区和挂载
    一、准备工作(1)查看主机磁盘命令:lsblk(2)查看主机磁盘挂载文件系统情况命令:df-h二、磁盘分区(1)分区命令:fdisk-b1024/dev/vda其中:b1024,一个sectorsize的大小;1GB;使用-b指定sector时,每个sector的大小是:sectorsize(512,1024,2048or4096)。(2)根据提示填写相应信息n,是......