未加星标

Linux高级文本处理之gawk语法和基础命令

字体大小 | |
[系统(linux) 所属分类 系统(linux) | 发布者 店小二04 | 时间 2017 | 作者 红领巾 ] 0人收藏点击收藏
一、引言

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 [[email protected] ~]# grep '^mail' /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[[email protected] ~]# 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执行流程图:


Linux高级文本处理之gawk语法和基础命令
实例1: [[email protected] ~]# awk '
> BEGIN{FS=":";print "----header----"} #打印内容字符串要用双引号,单引号有语法错误
> /mail/{print $1}
> END{print "----footer----"}
> ' /etc/passwd
----header----
mail
----footer----

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

实例2:通过awk脚本执行实例1中的命令 [[email protected] ~]# cat myscript.awk
BEGIN{
FS=":"
print "----header----"
}
/mail/{
print $1
}
END{
print "----footer----"
}
[[email protected] ~]# awk -f myscript.awk /etc/passwd
----header----
mail
----footer----

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

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

实例3:只使用BEGIN无输入文件 [[email protected] ~]# awk 'BEGIN{print "HELLO WORLD"}'
HELLO WORLD 4.多个输入文件:

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

实例4: 多文件处理

[[email protected] ~]# 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:不带参数 [[email protected] ~]# 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 的参数来指定要打印的字段。 [[email protected] ~]# awk '{print $2}' ./emp #默认以空格为分隔符
Doe,CEO
Smith,IT
Reddy,Sysadmin
Ram,Developer
Miller,Sales 实例3:输出雇员姓名与职位 [[email protected] ~]# cat emp
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
[[email protected] ~]# 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:只处理匹配行 [[email protected] ~]# awk -F, '/Manager/{print $2,$3}' emp
Jason Smith IT Manager
Jane Miller Sales Manager 实例2:只打印雇员 id 为 102 的雇员的信息 [[email protected] ~]# awk -F, '/^102/{print "Emp is 102 is",$2}' emp
Emp is 102 is Jason Smith

本文地址 : http://www.linuxidc.com/Linux/2017-02/140316.htm

本文系统(linux)相关术语:linux系统 鸟哥的linux私房菜 linux命令大全 linux操作系统

分页:12
转载请注明
本文标题:Linux高级文本处理之gawk语法和基础命令
本站链接:http://www.codesec.net/view/530696.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 系统(linux) | 评论(0) | 阅读(32)