Quantcast
Channel: CodeSection,代码区,Linux操作系统:Ubuntu_Centos_Debian - CodeSec
Viewing all articles
Browse latest Browse all 11063

文本编辑三剑客之gawk

$
0
0

awk

本章内容:

awk介绍

awk基本用法

awk变量

awk格式化

awk操作符

awk条件判断

awk循环

awk数组

awk函数

调用系统命令

1.awk介绍

linux 文本处理工具三剑客:grep、sed、awk。其中grep是一种文本过滤工具;sed是文本行编辑器,而awk是一种报表生成器,就是对文件进行格式化处理的,但这里的格式化不是文件系统的格式化,而是对文件内容进行各种“排版”,进而格式化显示;

★ 在Linux之上我们使用的是GNU awk 简称gawk,并且gawk就是awk的链接文件,因此系统上使用的awk和gawk是一样的。我们通过man gawk可以获得gawk的相关功能说明―gawk-pattern scanning and processing language(模式扫描及处理语言), gawk是一种过程式编程语言 。 gawk还支持条件判断、数组、循环等编程语言中所有可以使用的功能,因此还可以把gawk称为一种脚本语言解释器。

1)介绍如下:

★ 文本处理三工具:grep、sed、awk

grep,egrep,fgrep:文本过滤工具:partten

sed:行编辑器;模式空间、保持空间

awk:报告生成器,格式化文本输出;

★ AWK

Aho, Weinberger, Kernighan,报告生成器,格式化文本输出;

有多种版本:New awk(nawk),GNU awk(gawk);

gawk 模式扫描和处理语言;

[root@centos7 ~]# which awk
/usr/bin/awk
[root@centos7 ~]# ll /usr/bin/awk
lrwxrwxrwx. 1 root root 4 Jul 25 23:58 /usr/bin/awk -> gawk

★ 基本用法:

awk[options] ‘program’ var=value file… awk[options] -f programfilevar=value file… awk[options] 'BEGIN{ action;… } pattern{ action;… } END{ action;… }' file …

awk程序通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块,共3部分组成

用法说明 1)用法格式,选项 ★ 基本格式:awk [options] 'program' file…

program:PATTERN{ACTION STATEMENT;..},通常是在单引号和双引号中;

program:编程语言;

PARTTERN:

模式; 部分决定动作语句何时触发及触发事件 (BEGIN,END)

ACTION STATEMENT:

动作语句,可以由多个语句组成,各语句之间使用分号分隔:如print,printf

★ options(选项):

-F:指明输入时用到的字段分隔符;

-v var=value: 自定义变量

★ 分割符、域和记录

awk执行时,由分隔符分隔的字段(域);标记$1,$2..$n称为域标识。$0为所有域,注意:和shell中变量$符含义不同

文件的每一行称为记录

省略action,则默认执行print $0 的操作。

2)awk工作原理

★ 原理:

awk在处理文本时也是 一次读取一行文本,然后根据输入分隔符(默认为空格字符)进行切片 ,切成n个片段,然后将每一片都赋予awk内部的一个变量当中进行保存,这些变量名为$1,$2,$3…等等一直到最后一个,awk就可以对这些片段进行单独处理,比如显示某一段,特定段,甚至可以对某些片段进行额外的的加工处理,比如计数、运算等。

★ 具体工作原理如下 :

第一步:执行BEGIN{action;… }语句块中的语句;

第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。

第三步:当读至输入流末尾时,执行END{action;…}语句块

BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中

END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块

pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

举例:

[root@centos7 ~]# tail -5 /etc/fstab # 取 /etc/fstab 的后五行
UUID=5de91e7f-4334-4646-8bcf-7e8df5969f74 / xfs defaults 0 0
UUID=abad3f46-4294-40b0-9d48-78c7e87cbfbf /boot xfs defaults 0 0
UUID=01aef744-48b5-4346-ab7d-33150e05f3c7 /usr xfs defaults 0 0
UUID=9765d553-e77b-48db-a4ff-502e43833384 swap swap defaults 0 0
UUID=a42aca7a-085a-43c2-a22c-4f4aa6a22574 /testdir ext4 acl 0 0
[root@centos7 ~]# tail -5 /etc/fstab |awk '{print $2,$3}' # 对读进来的每一行都执行打印第2和第3片段
/ xfs
/boot xfs
/usr xfs
swap swap
/testdir ext4
[root@centos7 ~]# tail -5 /etc/fstab |awk '{print "hello",$2,$3}'
hello / xfs
hello /boot xfs
hello /usr xfs
hello swap swap
hello /testdir ext4 输出命令:print

print格式:print item1, item2, …

要点:

(1) 逗号分隔符;

(2) 输出的各item可以是字符串,也可以是数值、 当前记录的字段、变量或awk的表达式;

(3) 如省略item,相当于print $0

演示:

[root@centos7 ~]# awk '{print "hello,awk"}' # 不管输入什么都只打印定义好的
asdas
hello,awk
asfas
hello,awk
dddd
hello,awk
[root@centos7 ~]# awk -F: '{print}' /etc/passwd # 把/etc/passwd的每一行都打印一遍
root:x:0:0:tcpdump,,62985600:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
[root@centos7 ~]# awk -F: '{print "tao"}' /etc/passwd # /etc/passwd 的每一行输入进去之后都打印成 tao
tao
tao
tao
tao
[root@centos7 ~]# awk -F: '{print $1}' /etc/passwd # 以:为分隔符,打印每一行的第一个片段
root
bin
daemon
adm
lp
[root@centos7 ~]# awk -F: '{print $1"\t"$3}' /etc/passwd # 也可以用其他分隔符,但一定要加双引号。
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5 awk变量

内置和自定义变量

★内置变量

FS : 输入字段分隔符,默认为空白字符

awk -v FS=':' '{print $1,$3,$7}’ /etc/passwd

awk F: '{print $1,$3,$7}’ /etc/passwd

OFS : 输出字段分隔符,默认为空白字符

awk-v FS=‘:’ -v OFS=‘:’ '{print $1,$3,$7}’ /etc/passwd

RS : 输入记录分隔符,指定输入时的换行符,原换行符仍有效

awk -v RS=' ' ‘{print }’ /etc/passwd

ORS : 输出记录分隔符,输出时用指定符号代替换行符

awk-v RS=' ' -v ORS='###'‘{print }’ /etc/passwd

NF:字段数量


Viewing all articles
Browse latest Browse all 11063

Trending Articles