Table of Contents

awk功能

线路寻址

预定义的awk值

变数

条件和循环


推荐阅读:《Linux指令:sed和awk指令》


在详细介绍了sed 之后,还很了解awk(gawk)–可编程流编辑器

Awk帮助您处理结构化数据并生成报告。awk实际上是一种编程语言,其语法类似于C。awk使用三个“块”指令:BEGIN,主循环和END,并且它使用与sed相似的行寻址原理

awk功能


  • 将文本文件视为一系列记录的能力
  • 变数
  • 算术(也是浮点数)和字符串运算符
  • 循环和条件
  • 生成格式化的报告
  • 定义功能
  • 直接从脚本执行UNIX命令
  • 直接处理UNIX命令的输出
  • 处理命令行参数
  • 处理多个输入流

编程模型

在awk中使用了三个“块”指令:

  • BEGIN,在读取第一条输入行之前执行
  • 对输入的每一行执行的循环
  • 读取最后一条输入行后执行END
  • BEGIN和END过程是可选的

每个输入行都被视为一条记录,称为$ 0,每个单词(由空格或制表符分隔)都被视为一个字段。使用“ $”来引用字段($ 1 –第一个字段,$ 2 –第二,依此类推)。

简单的例子

# cat emp
avi 1200 haifa
dani 2300 tel aviv
rina 3100 aco# awk '{ print $1,"-",$3 }' emp
avi - haifa
dani - tel
rina - aco

简单打印文件:

awk ' { print } ' filename

使用BEGIN和END:

# awk 'BEGIN { print "Customers List:\n==="} { print } END { print "====\nnum:" NR }' empCustomers List:
===
avi 1200 haifa
dani 2300 tel aviv
rina 3100 aco
====
num:3

编写脚本:

#!/usr/bin/awk -f
{ print $1,"-",$3 }

运行:

# simp emp
avi - haifa
dani - tel
rina - aco

带块脚本

#! /usr/bin/awk -fBEGIN { print "Customers List:"print "==============="
} { print NR , "-" ,$0 } END { print "========="print "num:" NR
}

运行:

# ./simple emp
Customers List:
===============
1 - avi 1200 haifa
2 - dani 2300 tel aviv
3 - rina 3100 aco
=========
num:3

注意使用NR的行号。

线路寻址

可以将命令限制为带有模式的行

#!/usr/bin/awk -f
BEGIN    { print "Header" }/[0-9]+/    { print "Found Number" }/[A-Za-z]+/ { print "Found Word"   }/^$/        { print "Found Blank line"  }END      { print "Footer" }

用它:

# cat ./uselinead
hello 100
233
byehi20
# ./linead uselinead
Header
Found Number
Found Word
Found Number
Found Word
Found Blank line
Found Word
Found Blank line
Found Number
Footer

预定义的awk值

  • FS –字段分隔符–默认空格和制表符
  • OFS –输出字段分隔符–默认空间
  • RS –记录分隔符–默认换行符
  • ORS –输出记录分隔符–默认换行符
  • OFMT –输出格式–默认为“%.6g”

常数:

  • NF –字段数,即特定行上的单词数
  • NR –记录数,即到目前为止读取的行数
  • FILENAME –当前正在处理的文件的名称
  • FNR –当前文件中的当前行号(仅nawk)

范例

用例

#!/usr/bin/awk -f
BEGIN{ FS=","} {print $3,$2}

useemp2

#!/usr/bin/awk -f
BEGIN{ FS=","; OFS="*"} {print $3,$2}

运行

# cat ./emp2
avi,1200,haifa
dani,2300,tel aviv
rina,3100,aco# ./useemp emp2
haifa 1200
tel aviv 2300
aco 3100# ./useemp2 emp2
haifa*1200
tel aviv*2300
aco*3100

变数

没有声明变量,只是给定名称和值。未初始化的变量设置为零。类型基于分配(字符串,数字)

示例–计算文件大小的总和:

#!/usr/bin/awk -f{ print; numfiles=numfiles + 1; numbytes=numbytes + $5 }
END { print numfiles, "files,", numbytes, "bytes" }

使用管道运行它:

ls -l | ./calcsize
total 56
-rw-rw-r-- 1 developer developer 187 אוג 16  2017 avg
-rwxrwxr-x 1 developer developer 310 אוג 16  2017 avg.awk
-rwxrwxr-x 1 developer developer 117 אוג 16  2017 calcsize
-rwxrwxr-x 1 developer developer 382 אוג 14  2017 checkops
-rw-rw-r-- 1 developer developer  48 אוג 16  2017 emp
-rw-rw-r-- 1 developer developer  48 פבר 16 09:39 emp2
-rwxrwxr-x 1 developer developer 198 פבר 16 09:24 linead
-rw-rw-r-- 1 developer developer 254 אוג 14  2017 oplist
-rwxrwxr-x 1 developer developer 154 פבר 16 09:16 simple
-rwxrwxr-x 1 developer developer 148 אוג 16  2017 simple2
-rwxrwxr-x 1 developer developer  49 פבר 16 09:37 useemp
-rwxrwxr-x 1 developer developer  41 פבר 16 08:47 useemp1
-rwxrwxr-x 1 developer developer  57 פבר 16 09:37 useemp2
-rw-rw-r-- 1 developer developer  26 פבר 16 09:25 uselinead
15 files, 2019 bytes

另一个例子

给定以下文件:

Name             CM Ph Cmp Math
avi levy         68 72 91  73
eli cohen        31 59 73  87
bibi netanyahu   83 80 89  61
donald tramp     53 72 78  93
Julia roberts    69 68 79  89

和awk脚本:

#!/usr/bin/awk -f
BEGIN   {print "grades report"print "============="
}NR == 1 { next }{ lines++; fullname = $1 " " $2print fullname, ($3 + $4 + $5 + $6) / 4sum1 += $3; sum2 += $4; sum3 += $5; sum4 += $6 }
END {print ""print "Totals"print "======"print sum1/lines, sum2/lines, sum3/lines, sum4/lines
}

运行:

# ./avg.awk ./avg
grades report
=============
avi levy 76
eli cohen 62.5
bibi netanyahu 78.25
donald tramp 74
Julia roberts 76.25Totals
======
60.8 70.2 82 80.6

条件和循环

语法类似于C

给定以下输入文件:

# Year : Month : Day : Customer : D / W : Amount
2015:11:9:Joe:W:5.00
2015:11:12:Mary:W:5.50
2015:12:10:Joe:W:10.00
2015:12:15:Mary:W:10.00
2016:1:2:Hank:W:35.00
2016:1:31:David:D:100.00

使用循环和条件:

#! /usr/bin/awk -f
# Year : Month : Day : Recipient : D / W : Amount
BEGIN { FS = ":" }# skip lines started with #
/^[#]/  { next }    # simple conditions
$5 == "W" { withdrawals[$4] += $6 }
$5 == "D" { deposits[$4] += $6 }END {print "Deposit totals:"for (i in deposits)printf("\t%s: $%g\n", i, deposits[i])print ""print "Withdrawal totals:"for (i in withdrawals)if(withdrawals[i] > 15)printf("\t%s: $%g\n", i, withdrawals[i])
}

运行:

# ./checkops ./oplist
Deposit totals:David: $100Withdrawal totals:Hank: $35Mary: $15.5

Linux指令:AWK - 可编程流编辑器相关推荐

  1. 第十九章 文本处理流编辑器:awk编程

    第十九章 文本处理流编辑器:awk编程 名词解释 awk 是一种编程语言,用于linux/unix下对文本和数据进行处理.数据可以来自标准输入(stdin).一个或多个文件.或其它命令的输出.它支持用 ...

  2. Linux Shell编程笔记6 sed流编辑器

    简介 sed是一个流编辑器,它会读取文件流,以行为单位进行处理.sed会按照顺序执行对每一行执行命令.sed把每一行结果写入标准输出,不修改任何输入文件.一般来说,文件流需要处理每一行的时候,需要借助 ...

  3. shell中的流编辑器awk

    shell中的流编辑器awk 文章目录 shell中的流编辑器awk awk命令 awk工作原理 awk的命令格式 awk常见的内建变量(可直接使用) awk按行输出文本 awk以字段输出文本 awk ...

  4. 详解流编辑器 sed 和 编程语言 awk

    一.流编辑器 sed sed 是一个精简的.非交互式的流式编辑器,它在命令行中输入编辑命令和指定文件名,然后在屏幕上查看输出. 逐行读取文件内容存储在临时缓冲区中,称为"模式空间" ...

  5. linux shell中的流编辑器sed的使用

    sed流编辑器 23.3.1  sed  strem editor 流编辑器 sed编辑器是一行一行的处理文件内容的.正在处理的内容存放在模式空间(缓冲区)内,处理完成后按照选项的规定进行输出或文件的 ...

  6. 《Linux指令从入门到精通》——4.3 Linux下全屏幕文本编辑器的命令行方式

    本节书摘来自异步社区<Linux指令从入门到精通>一书中的第4章,第4.3节,作者:宋磊 , 宋馥莉 , 雷文利著,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...

  7. 《Linux指令从入门到精通》——4.2 Linux下的简单文字模式文本编辑器

    本节书摘来自异步社区<Linux指令从入门到精通>一书中的第4章,第4.2节,作者:宋磊 , 宋馥莉 , 雷文利著,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...

  8. shell脚本编程笔记(九)—— 初识流编辑器 sed

    一. 流编辑器 sed编辑器被称作流编辑器(stream editor).在交互式文本编辑器中(比如vim),你可以用键盘命令来交互式地插入.删除或替换数据中的文本.流编辑器则基于预先提供的一组命令来 ...

  9. linux中指令是在那里使用的?_关于启停保基础指令在实际编程中的使用

    我们先说下第一个专题:启停专题 我们家里都有灯泡开关,墙壁开关,向上按下灯亮,向下按一下灯灭.这是我们最原始的启停模型. 图1 这种程序在PLC中也会存在就是我们的按钮是按一下置位,再按一下复位的,就 ...

最新文章

  1. .net的label的背景如何设置成为透明_新一轮广告呈现方式变革,新橱窗广告,如何收割注意力经济?...
  2. mybatis-批量操作
  3. duilib WindowImplBase BUG修复 --- 按一次ESC键, 关闭多个窗口
  4. sring-list-del-string-int:解析左右编码器的,和#号
  5. HTTP协议(学习笔记)
  6. activemq 修改服务端端口61616和控制台端口8161启动
  7. 强悍的 Linux —— tar
  8. AlphaGo实力远超对手
  9. c语言开发gc,GC的基本原理
  10. ISO/OSI七层网络参考模型、TCP/IP四层网络模型和教学五层网络模型
  11. KDD CUP 99利用决策分类树进行网络异常检测
  12. 【数学基础】欧式变换、相似变换、仿射变换、射影变换
  13. 掌财社骑士:顾比均线怎么设置?顾比均线的投资技巧介绍
  14. APISpace 中文分词API
  15. 小白入职公司都是自己看,嫌弃增删改查,做了2年感觉没前途?
  16. 单片机 李广弟_单片机基础(第3版)
  17. 产品分析之用户评论分析
  18. 7-31 【0413】考拉兹猜想
  19. SAP UI5 表格数据如何导出成 Excel 文件(Table Export As Excel)
  20. 敏捷开发与瀑布式开发的区别

热门文章

  1. MySQL学习-排序与分组函数
  2. EasyUI+JSP之java读取数据库后JSON格式数据的返回及调用
  3. 震惊!几道Python 理论面试题,Python面试题No18
  4. macOS 调用浏览器打开网页
  5. [我的理解]Javascript的原型与原型链
  6. linux 系统负载高 如何检查
  7. Hibernate4+Spring JPA+SpringMVC+Volecity搭建web应用(二)
  8. HDU 4515 推断时间
  9. firefox浏览器优化-速度超chrome
  10. havlenapetr ffmpeg的移植