一、使用变量

gawk支持两种不同类型的变量:

  • 内建变量
  • 自定义变量

1.1 内建变量

①字段和记录分隔符变量

FIELDWIDTHS:有空格分割的一列数字,定义了每个数据字段确切宽度

  • FS:输入字段分隔符
  • RS:输入记录分隔符
  • OFS:输出字段分隔符
  • ORS:输出记录分隔符
chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{FS=","; OFS="-"} {print $1,$2,$3}' data1
data11-data12-data13
data21-data22-data23
data31-data32-data33
chen@ubuntu:~/shell/ch22$ cat data1
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35
chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{FS=","; OFS="--"} {print $1,$2,$3}' data1
data11--data12--data13
data21--data22--data23
data31--data32--data33
chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{FS=","; OFS="<-->"} {print $1,$2,$3}' data1
data11<-->data12<-->data13
data21<-->data22<-->data23
data31<-->data32<-->data33 cat data1b
1005.3247596.
-2.349194.
05180.1298100.
chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{FIELDWIDTHS="3 5 2 5"}{print $1,$2,$3,$4}' data1b
5.324 96.37
-2.34 94.00
80.12 100.1 chen@ubuntu:~/shell/ch22$ cat data2
Riley Mullen
Main Street
Chicago, IL
()- Frank Williams
Oak Street
Indianapolis, IN
()- Haley Snell
Elm Street
Detroit, MI
()-
chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{FS="\n"; RS=""}{print $1,$4}' data2
Riley Mullen ()-
Frank Williams ()-
Haley Snell ()-
#把换行符变成字段分隔符,把空行当做一个字段分隔符

字段分隔符例子

②数据变量

  • ARGC:当前命令行参数个数
  • ARGIND:当前文件在ARGV中的位置
  • ARGV:包含命令行参数的数组
  • CONVFMT:数字的转换格式
  • ENVIRON:当前shell环境变量及其值组成的关联数组
  • ERRNO:当读取或闭输入文件发生错误时的系统错误号
  • FILENAME:用作gawk输入数据的数据文件的文件名
  • FNR:当前数据文件中的数据行数
  • IGNORECASE:设成非零值时,忽略gawk命令中出现的字符串的字符大小写
  • NF:数据文件中的字段总数
  • NR:已处理的输入记录数
  • OFMT:数字的输出格式,默认值为%.6g
  • RLENGTH:由match函数所匹配的子字符串的长度
  • RSTART:由match函数所匹配的子字符串的起始位置
chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{print ARGC,ARGV[1]}' data1
data1
chen@ubuntu:~/shell/ch22$ cat data1
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35
chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{print ARGC,ARGV[0]}' data1
gawk
chen@ubuntu:~/shell/ch22$ gawk '
> BEGIN{
> print ENVIRON["HOME"]
> print ENVIRON["PATH"]
> }'
/home/chen
/home/chen/bin:/home/chen/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{FS=":"; OFS=":"} {print $1,$NF}' /etc/passwd
root:/bin/bash
daemon:/usr/sbin/nologin
bin:/usr/sbin/nologin
sys:/usr/sbin/nologin chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{FS=","}{print $1,"FNR="FNR}' data1 data1
data11 FNR=
data21 FNR=
data31 FNR=
data11 FNR=
data21 FNR=
data31 FNR=
chen@ubuntu:~/shell/ch22$ cat data1
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35

数据变量例子

1.2 自定义变量

gawk自定义变量名可以是任意数目的字母、数字和下划线。gawk变量名区分大小写。

①在脚本中给变量赋值

chen@ubuntu:~/shell/ch22$ gawk '
> BEGIN{
> testing="This is a test"
> print testing
> }'
This is a test
chen@ubuntu:~/shell/ch22$ gawk '
> BEGIN{
> testing="This is a test"
> print testing
> testing=
> print testing
> }'
This is a test chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{x=4; x= x * 2 + 3; print x}'

变量赋值例子

②在命令行上给变量赋值

chen@ubuntu:~/shell/ch22$ cat script1
BEGIN{FS=","}
{print $n}
chen@ubuntu:~/shell/ch22$ gawk -f script1 n= data1
data12
data22
data32
chen@ubuntu:~/shell/ch22$ gawk -f script1 n= data1
data13
data23
data33 chen@ubuntu:~/shell/ch22$ gawk -f script2 n= data1
The starting value is
data13
data23
data33
chen@ubuntu:~/shell/ch22$ cat script2
BEGIN{print "The starting value is",n; FS=","}
{print $n} chen@ubuntu:~/shell/ch22$ gawk -v n= -f script2 data1
The starting value is
data13
data23
data33

命令行上给变量赋值例子

二、处理数组

2.1 定义数组变量

数组变量赋值的格式如下:

var[index] = element

其中var是变量,index是关联数组的索引值,element是数据元素

chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{
> capital["Illinois"] = "Springfield"
> print capital["Illinois"]
> }'
Springfield
chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{
> var[] =
> var[] =
> total = var[] + var[]
> print total
> }'

定义数组变量

2.2 遍历数组变量

gawk中遍历数组,用一种for的特殊形式

for ( var in array )
{
  statements
}

使用例子:

chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{
var["a"] =
var["g"] =
var["m"] =
var["u"] =
for ( test in var)
{
print "Index:",test," - Value:",var[test]
}
}'
Index: u - Value:
Index: m - Value:
Index: a - Value:
Index: g - Value:

数组遍历

2.3 删除数组变量

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

delete array[index]

删除命令会从数组中删除关联索引值和相关的数据元素值

chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{
> var["a"] =
> var["g"] =
> 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:
Index: g - Value:
---
Index: a - Value:

删除例子

三、使用模式

本节将会演示如何在gawk脚本中用匹配模式来限定程序脚本作用在哪些记录上。

3.1 正则表达式

在使用正则表达式时,正则表达式必须出现在它要控制的程序脚本的左花括号前。

myfly2@ubuntu:~$ cat data1
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35
myfly2@ubuntu:~$ awk 'BEGIN{FS=","} /11/{print $1}' data1
data11
myfly2@ubuntu:~$ awk 'BEGIN{FS=","} /,d/{print $1}' data1
data11
data21
data31

匹配符例子

3.2 匹配操作符

匹配操作符:允许将正则表达式限定在记录中的特定数据字段。

匹配操作符是波浪线(~)。可以指定匹配操作符、数据字段变量以及要匹配的正则表达式。

$1 ~ /^data/

$1:代表记录中的第一个数据字段。这个表达式会过滤出第一个字段以文本data开头的所有记录。

myfly2@ubuntu:~$ awk 'BEGIN{FS=","} $2 ~ /^data2/{print $0}' data1
data21,data22,data23,data24,data25 myfly2@ubuntu:~$ awk -F: '$1 ~ /myfly/{print $1,$NF}' /etc/passwd
myfly2 /bin/bash

匹配操作符例子

$1 !~ /expression/

myfly2@ubuntu:~$ awk -F: '$1 !~ /myfly2/{print $1,$NF}' /etc/passwd
root /bin/bash
daemon /usr/sbin/nologin
bin /usr/sbin/nologin
sys /usr/sbin/nologin
sync /bin/sync
games /usr/sbin/nologin
man /usr/sbin/nologin
lp /usr/sbin/nologin

!~例子

3.3 数学表达式

除了正则表达式,也可以在匹配模式中用数学表达式。 常用的表达式:

  • x == y:值x等于y
  • x <= y:值x小于等于y
  • x < y:值x小于y
  • x >= y:值x大于等于y
  • x > y:值x大于y
myfly2@ubuntu:~$ awk -F: '$4 == 0{print $1}' /etc/passwd
root
myfly2@ubuntu:~$ awk -F, '$1 == "data"{print $1}' data1
myfly2@ubuntu:~$ cat data1
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35
myfly2@ubuntu:~$ awk -F, '$1 == "data11"{print $1}' data1
data11 #与正则表达式不同,数学表达式必须完全匹配

例子

四、结构化命令

4.1 if语句

gawk支持标准的if-then-else格式的if语句。

格式: if (condition)

  statement1

也可以这样:if (condition) statement1

awk '{if ($1 > 20) print $1}' data4

myfly2@ubuntu:~/shell/ch22$ awk '{
> if ($ > )
> {
> x = $ *
> print x
> }
> }' data4

if-then例子

4.2 while语句

基本循环的格式:

while (condition)

{

  statement1

}

myfly2@ubuntu:~/shell/ch22$ awk '{
total =
i =
while (i<)
{
total += $i
i++
}
avg = total /
print "Average:",avg
}' data5
Average: 128.333
Average: 137.667
Average: 176.667
myfly2@ubuntu:~/shell/ch22$ awk '{
> total =
> i =
> while (i<)
> {
> total += $i
> if(i == )
> break
> i++
> }
> avg = total /
> print "The average of the first two data elements is:",avg
> }' data5
The average of the first two data elements is:
The average of the first two data elements is: 136.5
The average of the first two data elements is: 157.5

while例子

4.3 do-while语句

格式:

do

{

  statements

}

myfly2@ubuntu:~/shell/ch22$ awk '{
> total =
> i =
> do
> {
> total += $i
> i++
> }
> while (total < )
> print total }' data5

do while例子

4.4 for语句

格式:for( variable assignment; condition; iteration process)

myfly2@ubuntu:~/shell/ch22$ awk '{
> total =
> for(i=;i<;i++)
> {
> total += $i
> }
> avg = total /
> print "Average:",avg
> }' data5
Average: 128.333
Average: 137.667
Average: 176.667

for例子

五、格式化打印

六、内建函数

6.1 数学函数

6.2 字符串函数

6.3 时间函数

七、自定义函数

7.1 定义函数

7.2 使用自定义函数

7.3 创建函数库

八、实例

gawk进阶的更多相关文章

  1. 《Linux命令行与shell脚本编程大全》第二十二章 gawk进阶

    gawk是一门功能丰富的编程语言,你可以通过它所提供的各种特性来编写好几程序处理数据. 22.1 使用变量 gawk编程语言支持两种不同类型的变量: 内建变量和自定义变量 22.1.1 内建变量 ga ...

  2. Shell编程—gawk进阶

    1使用变量 awk编程语言支持两种不同类型的变量: 内建变量 自定义变量 1.1内建变量 1. 字段和记录分隔符变量 数据字段变量允许你使用美元符号($)和字段在该记录中的位置值来引用记录对应的字段. ...

  3. 两个有用的shell工具总结

    shell工具之一:sed sed基础 sed编辑器被称作流编辑器,与常见的交互式文本编辑器刚好相反.文本编辑器可以通过键盘来交互式地插入.删除.替换文本中的数据:而流编辑器是基于一组预先的规则来编辑 ...

  4. 《Linux命令行与shell脚本编程大全 第3版》

    第一部分 Linux 命令行 第1章  初识Linux she1.1   什么是Linux 21.1.1 深入探究Linux 内核 31.1.2 GNU 工具 61.1.3 Linux 桌面环境 81 ...

  5. Linux三剑客之awk精讲(基础与进阶)

    第1章 awk基础入门 要弄懂awk程序,必须熟悉了解这个工具的规则.本实战笔记的目的是通过实际案例或面试题带同学们熟练掌握awk在企业中的用法,而不是awk程序的帮助手册. 1.1 awk简介 一种 ...

  6. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  7. nodejs进阶(4)—读取图片到页面

    我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...

  8. JavaScript进阶之路(一)初学者的开始

    一:写在前面的问题和话 一个javascript初学者的进阶之路! 背景:3年后端(ASP.NET)工作经验,javascript水平一般般,前端水平一般般.学习资料:犀牛书. 如有误导,或者错误的地 ...

  9. nodejs进阶(3)—路由处理

    1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回. url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) ...

随机推荐

  1. 《图解设计模式》读书笔记8-3 STATE模式

    目录 State模式 示例程序 实现的功能 不使用&使用状态模式对比 示例程序的类图 代码 角色和类图 角色 类图 拓展思路 分而治之 依赖于状态的处理 谁来管理状态迁移 易于增加新状态 实例 ...

  2. Shell脚本中的特殊字符(美元符、反斜杠、引号等)作用介绍

    Shell中的特殊字符有 1.$ 美元符 2.\ 反斜杠 3.` 反引号 4." 双引号 5.< ,>;,*,?,[,] 下面我一一举列说明 一.$符号 1.echo $? 显示 ...

  3. Linux-部署ftp

    通过外部window ftp 客户端 访问linux 有两种方法 方法一:Linux系统未安装vsftp 服务 这个是本人使用的ftp客户端的版本号 启动ftp客户端,填写ip ,账号,密码 问题:当 ...

  4. MyBatis Generator 生成的example 使用 and or 简单混合查询

    MyBatis Generator 生成的example 使用 and or 简单混合查询 参考博客:https://www.cnblogs.com/kangping/p/6001519.html 简 ...

  5. Ubuntu操作系统的总结操作

    一.Ubuntu系统环境变量 Ubuntu Linux系统环境变量配置文件分为两种:系统级文件和用户级文件 1.系统级文件: /etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件 ...

  6. linux command --- terminal common commands

    switch to root : sudo su.su root.sudo -s switch to users : su god(user name) set root password : sud ...

  7. 第二次java面试(用友山东济南分公司)

    坐标:山东潍坊公共实训基地 面试单位:用友济南分公司(来了一位HR和技术经理) 本人状态:距离离校15天 宣讲: 1.女HR和男技术经理来到我们专业提前准备好的教室,先宣传海报和发传单,然后看了4个3 ...

  8. [2019杭电多校第三场][hdu6608]Fansblog

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6608 大致题意是比p小的最大素数q,求q!%p的值. 由威尔逊定理开始推: $(p-1)!\equiv ...

  9. python学习第四十六天dir( )函数用法

    dir( )函数有点像目录的意思,但是他是包含由模块定义的名称的字符串的排序列表.这个列表包含模块中定义的所有模块,变量和函数的名称. 列举其用法 import time content = dir( ...

  10. for循环延伸

    经典面试题解析: for(var i = 1 ; i < 5 ; i++){ console.log(i) } //1 2 3 4 ------------------------------- ...