一、引言

Awk 是一个维护和处理文本数据文件的强大语言。在文本数据有一定的格式,即每行数据包 含多个以分界符分隔的字段时,显得尤其有用。 即便是输入文件没有一定的格式,你仍然可 以使用 awk 进行基本的处理。 Awk 当然也可以没有输入文件,那不是必须的。 简言之, AWK 是一种能处理从琐碎的小事到日常例行公事的强大语言。

二、awk语法

1.基础语法:

awk [-F  field-separator] '/pattern/ {action}' input-file
(或者)
awk [-F  field-separator] '{action}' input-file

上面语法中:

  • -F 为字段分界符。如果不指定,默认会使用空格作为分界符。

  • /pattern/和{action}需要用单引号引起来。

  • /pattern/是可选的。如果不指定, awk 将处理输入文件中的所有记录。如果指定一个模式, awk 则只处理匹配指定的模式的记录。

  • {action} 为 awk 命令,可以是单个命令,也可以多个命令。整个 action(包括里面的所有命令)都必须放在{ 和 }之间。

  • Input-file 即为要处理的文件

实例1:打印/etc/passwd文件中mail用户所在行的用户名mail

[root@localhost ~]# grep '^mail' /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@localhost ~]# awk -F: '/mail/{print $1}' /etc/passwd #-F ":"也是正确的
mail

2.awk脚本:

当需要执行很多 awk 命令时, 可以把/pattern/{action}这一部分放到单独的文件中,然后调 用它:

awk –Fs –f myscript.awk input-file  #[-F  field-separator]简写 -FS

也可以在这个文件中设置字段分界符(后面详述),然后调用:

awk –f myscript.awk input-file

二、Awk 程序结构(BEGIN,body,END)区域

1.BEGIN 区域

Begin 区域的语法:

BEGIN { awk-commands }

说明:BEGIN 区域的命令只最开始、在 awk 执行 body 区域命令之前执行一次。

  • BEGIN 区域很适合用来打印报文头部信息,以及用来初始化变量。

  • BEGIN 区域可以有一个或多个 awk 命令

  • 关键字 BEGIN 必须要用大写

  • BEGIN 区域是可选的

2.body 区域

body 区域的语法:

/pattern/ {action}
  • body 区域的命令每次从输入文件读取一行就会执行一次

  • 如果输入文件有 10 行,那 body 区域的命令就会执行 10 次(每行执行一次)

  • Body 区域没有用任何关键字表示,只有用正则模式和命令。

3.END block

END 区域的语法:

  • END { awk-commands }

  • END 区域在 awk 执行完所有操作后执行,并且只执行一次。

  • END 区域很适合打印报文结尾信息,以及做一些清理动作

  • END 区域可以有一个或多个 awk 命令

  • 关键字 END 必须要用大写

  • END 区域是可选的

awk执行流程图:

实例1:

[root@localhost ~]# awk '
> BEGIN{FS=":";print "----header----"}   #打印内容字符串要用双引号,单引号有语法错误
> /mail/{print $1}
> END{print "----footer----"}
> ' /etc/passwd----header----
mail
----footer----

提示:如果命令很长,即可以放到单行执行,也可以用\折成多行执行。

实例2:通过awk脚本执行实例1中的命令

[root@localhost ~]# cat myscript.awk
BEGIN{
FS=":"
print "----header----"
}/mail/{
print $1
}END{
print "----footer----"
}
[root@localhost ~]# awk -f myscript.awk /etc/passwd
----header----
mail
----footer----

说明:awk 脚本中,注释以#开头。

只使用 BEGIN 区域在 awk 中是符合语法的。在没有使用 body 区域时,不需要指定输入文件, 因为 body 区域只在输入文件上执行。 所以在执行和输入文件无关的工作时,可以只使用 BEGIN 区域。

实例3:只使用BEGIN无输入文件

[root@localhost ~]# awk 'BEGIN{print "HELLO WORLD"}'
HELLO WORLD

4.多个输入文件:

awk 指定多个输入文件。如果指定了两个文件,那么 body 区域会首先在第一 个文件的所有行上执行,然后在第二个文件的所有行上执行。

实例4:多文件处理

[root@localhost ~]# awk -F: '
> BEGIN{print "----header----"}
> /mail/{print $1}
> END{print "----footer----"}
> ' /etc/passwd /etc/group
----header----
mail
mail
----footer----

注意:即是指定了多个文件, BEGIN 和 END 区域,仍然只会执行一次。

三、打印命令

默认情况下,awk 的打印命令 print(不带任何参数)会打印整行数据。下面的例子等价于”cat employee.txt”命令。

实例1:不带参数

[root@localhost ~]# awk '{print}' emp
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

实例2:也可以通过传递变量”$字段序号”作为 print 的参数来指定要打印的字段。

[root@localhost ~]# awk '{print $2}' ./emp  #默认以空格为分隔符
Doe,CEO
Smith,IT
Reddy,Sysadmin
Ram,Developer
Miller,Sales

实例3:输出雇员姓名与职位

[root@localhost ~]# cat emp
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager[root@localhost ~]# awk '
>BEGIN{FS=",";print "-------\nNAME  Title\n--------\n"}
>{print $2,"\t",$3}  #打印多变量,之间用逗号或者空格分隔
>END{print "----------------"}' emp
-------
NAME  Title
--------John Doe         CEO
Jason Smith      IT Manager
Raj Reddy        Sysadmin
Anand Ram        Developer
Jane Miller      Sales Manager
----------------

说明:请注意, $0 代表整条记录。 下面两个命令是等价的,都打印 employee.txt 的所有行:

awk '{print}' emp
awk '{print $0}' emp

四、模式匹配

只在匹配特殊模式的行数执行 awk 命令。

实例1:只处理匹配行

[root@localhost ~]# awk -F, '/Manager/{print $2,$3}' emp
Jason Smith IT Manager
Jane Miller Sales Manager

实例2:只打印雇员 id 为 102 的雇员的信息

[root@localhost ~]# awk -F, '/^102/{print "Emp is 102 is",$2}' emp
Emp is 102 is Jason Smith

转载于:https://blog.51cto.com/yolynn/1890927

Linux高级文本处理之gawk语法和基础命令(一)相关推荐

  1. linux循环处理多行,Linux高级文本处理之gawk分支和循环(四)

    一.if 结构 1.单条语句 语法:if(conditional-expression ) actionif 是关键字 conditional-expression 是要检测的条件表达式 action ...

  2. (三)Linux vi 文本编辑器,用户管理,组管理,Sudo命令,时间管理

    文章目录 具体内容 1.1 vi 文本编辑器 1.2 用户权限管理,组管理和时间管理 1.2.1 用户管理 1)保存用户信息的文件:/etc/passwd 2)保存用户密码信息的文件:/etc/sha ...

  3. linux 大文件编辑sed,Linux高级文本处理工具之sed(一)

    sed:Stream Editor文本流编辑,sed是一个"非交互式的"面向字符流的编辑器.能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模 ...

  4. Linux高级文本编辑器比较:kate vs gedit

    原文链接:点击打开链接 所有Linux使用者都会告诉你,不论是对于新手还是职业老手,一个好的文本编辑器都是电脑系统的重要组成部分.虽然使用终端文本编辑器(如nano或者vim)也很重要,但是不论何时只 ...

  5. Linux高级文本处理之sed(三)

    sed高级命令 sed允许将多行内容读取到模式空间,这样你就可以匹配跨越多行的内容.本篇笔记主要介绍这些命令,它们能够创建多行模式空间并且处理之.其中,N/D/P这三个多行命令分别对应于小写的n/d/ ...

  6. linux硬盘分区(fdisk、lsblk)-------------------基础命令练习(一)

    fdisk磁盘分区命令 n 创建新分区 p 查看 d 删除 w 保存退出 q 不保存退出 案例一要求:.在磁盘 /dev/vdb 上按要求建立分区: 1.采用默认的msdos分区模式: 2.第1个分区 ...

  7. 总结如何从Linux开发工程师到Linux后台开发工程师再到Linux高级互联网架构师

    前言: 小编也是从事c方面10多年的工作经验.今天跟大家分享一下我总结出来的一系列 C/C Linux后台服务器开发的学习路线.从Linux开发工程师-Linux后台开发工程师-Linux高级互联网架 ...

  8. Linux中的高级文本处理命令,cut命令,sed命令,awk命令

    1.2.1 cut命令 cut命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields    ## 用于有特定分隔字符 [r ...

  9. linux中将文本中的单词换掉的指令_干货:Linux常用命令全称及讲解

    从事IT行业的很多人都会使用Linux常用命令,但是知道这些常用命令全称的人并不多,让我们来看看这些常用命令对应的全称吧!小编精心整理了一下,毕竟常用命令比较多,如果没有你常用的还望海涵,可以评论区补 ...

最新文章

  1. 剑指offer:二叉树的深度
  2. 一个没有意义的宇宙我们很难想象
  3. 练习: C#---函数(篮球弹起高度、等腰三角形)
  4. 程序员面试题精选100题(44)-数值的整数次方[算法]
  5. SOAP消息机制简介
  6. 《数据库SQL实战》获取所有员工当前的manager
  7. jquery --- 网页选项卡
  8. 通过Spring Boot了解H2 InMemory数据库
  9. apache log4j入门
  10. .net 多个dll 封装成一个dll_C#封装YOLOv4算法进行目标检测
  11. Android中TableLayout如何让列自动换行
  12. eureka服务注册中心集群模式创建
  13. vue项目中vue-router的使用
  14. 如何在C#中播放一些AVI短片,并且使背景透明
  15. 如何从Win11系统安装回win10系统?
  16. 5款最好的安卓界面设计工具推荐
  17. #2:在颓宅的边缘开始试探——4
  18. PAT-B 1036. 跟奥巴马一起编程(15)(15 分) 画方型字符
  19. ABAP SY标签一览表
  20. 会声会影最新版:会声会影2021中文版它来啦!

热门文章

  1. 第二十二章:动画(十五)
  2. 陈一舟:雷军马云在通讯领域也做不过马化腾 为何我就该挨骂
  3. C#调用C/C++ DLL 参数传递和回调函数的总结
  4. MobPush精准把握用户的使用时间
  5. 一键添加JAVA环境变量
  6. oracle 10g 用户管理笔记
  7. ASP中Randomize随机函数的使用
  8. 杂谈:《宫锁心玉》的穿越硬伤
  9. (原创)无废话C#设计模式之十二:Bridge
  10. 要管理此计算机上的用户账户,win10用户账户控制 你要允许此应用 若要继续请输入管理员密码...