gawk高级使用

BEGIN和END关键字是来用来读取数据流之前或之后执行命令的特殊模式

1、内建变量

FIELDWIDTHS:由空格分隔开的的定义每个数据字段确切宽度的一列数字

FS:输入字段分隔符

RS:输入数据行分隔符

OFS:输出字段分隔符

ORS:输出数据行分隔符

[[email protected] conf]# cat data2
data1,data2,data3,data4,data5
data6,data7,data8,data9,data10
data11,data12,data13,data14,data15
[[email protected] conf]# gawk ‘BEGIN{FS=",";OFS="-"} {print $1,$2,$3}‘ data2
data1-data2-data3
data6-data7-data8
data11-data12-data13

数据流占多行情况下

把RS变量设置成空白字符串,然后在数据行间留一个空白行。gawk会把每个空白行当作一个数据行分隔符

[[email protected] conf]# cat data3
Tom Mullen
123 Main Street
Chicago.IL 6001
(312)555-1234
Frank Williams
456 Oak street
Indianpolis.IN 46201
(317)55-9786
 [[email protected] conf]# gawk ‘BEGIN{FS="\n";RS=""} {print $1,$4}‘ data3
Tom Mullen (312)555-1234
Frank Williams (317)55-9786

2、数据变量

FNR:当前数据文件中的数据行数

NF:数据文件中的字段总数

NR:已处理的输入数据行数目

[[email protected] conf]# gawk ‘BEGIN{FS=":";OFS=";"}{print $1,$NF}‘ /etc/passwd
root;/bin/bash
bin;/sbin/nologin
daemon;/sbin/nologin
adm;/sbin/nologin
lp;/sbin/nologin
[[email protected] conf]# cat data2
data1,data2,data3,data4,data5
data6,data7,data8,data9,data10
data11,data12,data13,data14,data15

[[email protected] conf]# gawk ‘
BEGIN{FS=","}
{print $1,"FNR="FNR,"NR="NR}
END{print "there were",NR,"records processed"}‘ data2 data2
data1 FNR=1 NR=1
data6 FNR=2 NR=2
data11 FNR=3 NR=3
data1 FNR=1 NR=4
data6 FNR=2 NR=5
data11 FNR=3 NR=6
there were 6 records processed

3、自定义变量

变量名不能以数字开头,

[[email protected] conf]# gawk ‘
> BEGIN{
> testing="this is a test"
> print testing
> }‘
this is a test
[[email protected] conf]# gawk ‘BEGIN{X=4;X=X*2+3;print X}‘
11

在命令行上给变量赋值

[[email protected] tmp]# cat script1
#!/bin/bash
#
BEGIN{FS=","}
{print $n}

[[email protected] tmp]# cat data3
data1,data2,data3,data4,data5
data6,data7,data8,data9,data10
data11,data12,data13,data14,data15

[[email protected] tmp]# gawk -f script1 n=2 data3
data2
data7
data12

在设置变量后,这个值在代码的BEGINU部分不可用

[[email protected] tmp]# vim script1
#!/bin/bash
#
BEGIN{print "the starting value is ",n;FS=","}
{print $n}
[[email protected] tmp]# gawk -f script1 n=3 data3
the starting value is  
data3
data8
data13

加上-v,允许你指定BEGIN代码部分之前设定的变量

 [[email protected] tmp]# gawk -f script1 -v n=3 data3
the starting value is  3
data3
data8
data13

4、遍历数组

for (var in array)

{

statements

}

for语句在每次将关联数组array的下一个索引值赋给变量var时,执行一遍statements。
记住这个变量是索引值而不是数组元素的值

[[email protected] tmp]# gawk ‘BEGIN{
var["a"]=1
var["g"]=2
var["m"]=3
var["u"]=4
for (test in var)
{
print "Index:",test," - Valuse:",var[test]
}
}‘
Index: u  - Valuse: 4
Index: m  - Valuse: 3
Index: a  - Valuse: 1
Index: g  - Valuse: 2

删除数组的变量

从关联数组中删除数组索引要用一个特别命令

delete array[index]

[[email protected] tmp]# gawk ‘BEGIN{
var["a"]=1
var["g"]=2
for (test in var)
{
   print "Index:",test,"- Value",var[test]
}
delete var["g"]
print "------------"
for (test in var)
{
   print "Index:",test,"- Value",var[test]
}
> }‘
Index: a - Value 1
Index: g - Value 2
------------
Index: a - Value 1

5、匹配操作符

匹配操作符(~),允许将正则表达式限定在数据行中的特定数据字段。

$1 ~/expression/

用正则表达式/^data2/来匹配第二个数据段,过滤第二个字段以文本data2为开头的行

[[email protected] tmp]# cat data3
data1,data2,data3,data4,data5
data6,data7,data8,data9,data10
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25

[[email protected] tmp]# gawk ‘BEGIN{FS=","} $2 ~/[^data2]/{print $0}‘ data3
data6,data7,data8,data9,data10
data11,data12,data13,data14,data15

gawk程序脚本常用在数据文件查找特定数据元素的强大工具

[[email protected] tmp]# gawk -F: ‘$1 ~/root/{print $1,$NF}‘ /etc/passwd
root /bin/bash

用!符号来排除正则表达式的匹配

$1 !~/expression/

gawk -F: ‘$1 !~/root/{print $1,$NF}‘ /etc/passwd

6、数学表达式

x == y
 x <= y
 x < y
 x >= y
 x > y

如显示所有属于root用户组的(组ID为0)的系统用户

 [[email protected] tmp]# gawk -F: ‘$4==0{print $1}‘ /etc/passwd
root
sync
shutdown
halt
operator

对文本数据使用表达式,必须要小心,跟正则表达式不同,表达式必须完全匹配

[[email protected] tmp]# gawk -F, ‘$1== "data1" {print $1}‘ data3
data1

6、if语句

if (condition)
 statement1
或者 if (condition) statement1

[[email protected] tmp]# cat data4
10
5
3
13
55
[[email protected] tmp]# gawk ‘{if ($1>20) print $1}‘ data4
55
[[email protected] tmp]# gawk ‘{
> if ($1>20)
> {
>    x=$1 * 2
>    print x
> }
> }‘ data4
110

gawk的if语句也支持else子句,允许在if语句条件不成立的情况下执行一条或多条语句。

 [[email protected] tmp]# gawk ‘{
> if ($1>100)
> {
>   x=$1 * 2
>   print x
> } else
> {
>   x=$1 / 2
>   print x
> }}‘ data4
5
2.5
1.5
6.5
27.5

也可以这么写

if (condition) statement1:else statement2

[[email protected] tmp]# gawk ‘{if ($1>100) print $1*2;else print $1/2}‘ data4
5
2.5
1.5
6.5
27.5

7、while语句

while (condition)
{
   statement1
}

[[email protected] tmp]# cat data5
120 130 135
160 113 140
145 170 215
[[email protected] tmp]# gawk ‘{
total=0
i=1
while (i<4)
{   total+=$i
   i++
}
avg=total/3
print "Averaget:",avg
}‘ data5
Averaget: 128.333
Averaget: 137.667
Averaget: 176.667
Averaget: 0

8、do-while语句

do

{

statement1

} while (condition)

[[email protected] tmp]# gawk ‘{
total=0
i=1
do
{
  total+=$i
  i++
}while (total<150)
print total}‘ data5
250
160
315

9、for语句

for (variable assignment;condition;interation process)

[[email protected] tmp]# gawk ‘{
> tatal=0
> for (i=1;i<4;i++)
> {
>    total+=$i
> }
> avg=total/3
> print "Average:",avg
> }‘ data5
Average: 128.333
Average: 266
Average: 442.667
Average: 442.667

[[email protected] tmp]# gawk ‘{for (i=1;i<4;i++) total+=$i;avg=total/3;print "Average:",avg}‘ data5
Average: 128.333
Average: 266
Average: 442.667
Average: 442.667

[[email protected] tmp]# cat data5
120 130 135
160 113 140
145 170 215

10、格式化打印

在printf命令末尾手动添加换行符来生成新行
如果需要几个单独的printf命令来在同一行上打印多个输出

[[email protected] tmp]# cat data3
data1,data2,data3,data4,data5
data6,data7,data8,data9,data10
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25

[[email protected] tmp]# gawk ‘BEGIN{FS=","}{printf "%s ",$1}END{printf "\n"}‘ data3
data1 data6 data11 data21
[[email protected] tmp]# gawk ‘BEGIN{FS=","}{printf "%s ",$1}‘ data3
data1 data6 data11 data21 [[email protected] tmp]#
时间: 2024-11-03 05:32:15

gawk高级使用的相关文章

【更新完毕】Linux命令行与Shell脚本编程大全(第3版)读书笔记21-26章

第二十一章 sed进阶 N:将数据流中的下一行加进来创建一个多行组(multiline group)来处理. D:删除多行组中的第一行. P:打印多行组中的第一行. sed '/header/{n ; d}' data.txt 首先匹配有header的行,然后n表示移动到文本的下一行,然后进行删除.然后继续搜索data.txt中包含header的行,继续之前的流程. 加入有个文本的内容如下: [[email protected] ~]# cat data.txt On Tuesday, the

shell高级-----初识sed和gawk

sed编辑器 sed说明 sed是Linux下一款功能强大的非交互流式文本编辑器,可以对文本文件进行增.删.改.查等操作,支持按行.按字段.按正则匹配文本内容,灵活方便,特别适合于大文件的编辑. sed使用方法 sed的使用方法,调用sed 命令的语法有两种: 一.在命令行指定sed指令对文本进行处理:sed +选项  ‘指令’ 文件 二.先将sed指令保存到文件中,将该文件作为参数进行调用:sed   +选项  -f  包含sed指令的文件  文件 sed的常用选项 -e:它告诉sed将下一个

Linux高级文本处理之gawk内置变量(一)

一.FS –输入字段分隔符 FS是awk内置变量,用来制定行分隔符,功能能-F一样,区别在于FS只能用在BEGIN语句块当中,命令格式如下: BEGIN{FS="SEPARATOR"} 实例1: [[email protected] ~]# awk 'BEGIN { FS=","; print "---------------------------\nName\tTitle\n------------------------"} {print 

Linux高级文本处理之gawk分支和循环(四)

一.if 结构 1.单条语句 语法: if(conditional-expression ) action if 是关键字 conditional-expression 是要检测的条件表达式 action 是要执行的语句 2.多条语句 如果要执行多条语句,需要把他们放在{ } 中,每个语句之间必须用分号或换行符分开,如下所示. 语法: if (conditional-expression) { action1; action2; } 如果条件为真,{ } 中的语句会依次执行.当所有语句执行完后,

Linux高级文本处理之gawk实战(七)

1.取出linux中eth0的IP地址 [[email protected] ~]# ifconfig eth0 |awk -F '[ :]+' 'NR==2 {print $4}' 192.168.1.8 说明: "+"为正则表达式模式匹配至少重复一次. 2.统计文件中所有行单词出现的次数 [[email protected] ~]# awk ' >{for(i=1;i<=NF;i++) >{count[$i]++}} >END{for(j in count)

【转载更新】Linux工具之AWK 3.高级知识

原文:http://blog.hexu.org/archives/41.shtml#id2874788 awk编程 14.1. 变量 在awk中,变量不需要定义就可以直接使用,变量类型可以是数字或字符串.赋值格式:Variable = expression,如$ awk ‘$1 ~/test/{count = $2 + $3; print count}’ test,上式的作用是,awk先扫描第一个域,一旦test匹配,就把第二个域的值加上第三个域的值,并把结果赋值给变量count,最后打印出来.

awk的详解 基本用法和高级用法

1 awk 用途  报告生成工具,主要在处理文本方面特别强大,也是一个独立的程序语言,与grep sed 构成处理文本工具的三剑客. 同gawk 都是 GNU组织开发的开源工具 2 awk的工作原理,已每个记录进行每个域的分离,如 常常是以每一行作为一个记录,空白作为默认的与分隔符,然后以内置变量对每个域进行赋予变量! 3 语法结构 awk option scrips file 或这 echo “ ” | awk  option scripts 管道使用 option 选项主要有 -F  指定分

Java精品高级课,架构课,java8新特性,P2P金融项目,程序设计,功能设计,数据库设计,第三方支付,web安全,视频教程

36套精品Java架构师,高并发,高性能,高可用,分布式,集群,电商,缓存,性能调优,设计模式,项目实战,P2P金融项目,大型分布式电商实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  cloud.Dubbo.Elasticsearch,Redis.ActiveMQ.Nginx.Mycat.Spring.MongoDB.ZeroMQ.Git.Nosql.Jvm.Mecached.Netty.Nio.Mina.java8新特性,P2P金融项目,程序设计,

gawk 文本处理入门用法详集

awk笔记 gawk - pattern scanning and processing language 报告生成器,可进行格式化输出,文本处理三剑客之一,是基于sed和grep功能的扩展 一般用法格式: awk [options] 'program' FILE...     program: /regular/{print} 语句之间用分号分隔    print,printf 选项: -F:指明输入时用到的字段    -v var=value:指明自定变量 awk运作方式: 逐行读入文本,并