awk 用法:awk ' pattern {action} ' 



变量名 含义 

ARGC 命令行变元个数 

ARGV 命令行变元数组 

FILENAME 当前输入文件名 

FNR 当前文件中的记录号 

FS 输入域分隔符,默认为一个空格 

RS 输入记录分隔符 

NF 当前记录里域个数 

NR 到目前为止记录数 

OFS 输出域分隔符 

ORS 输出记录分隔符 



1、awk '/101/' file 显示文件file中包含101的匹配行。 

awk '/101/,/105/' file 

awk '$1 == 5' file 

awk '$1 == "CT"' file 注意必须带双引号 

awk '$1 * $2 >100 ' file 

awk '$2 >5 && $2<=15' file 

2、awk '{print NR,NF,$1,$NF,}' file 显示文件file的当前记录号、域数和每一行的第一个和最后一个域。 

awk '/101/ {print $1,$2 + 10}' file 显示文件file的匹配行的第一、二个域加10。 

awk '/101/ {print $1$2}' file 

awk '/101/ {print $1 $2}' file 显示文件file的匹配行的第一、二个域,但显示时域中间没有分隔符。 

3、df | awk '$4>1000000 ' 通过管道符获得输入,如:显示第4个域满足条件的行。 

4、awk -F "|" '{print $1}' file 按照新的分隔符“|”进行操作。 

awk 'BEGIN { FS="[: \t|]" } 

{print $1,$2,$3}' file 通过设置输入分隔符(FS="[: \t|]")修改输入分隔符。 



Sep="|" 

awk -F $Sep '{print $1}' file 按照环境变量Sep的值做为分隔符。 

awk -F '[ :\t|]' '{print $1}' file 按照正则表达式的值做为分隔符,这里代表空格、:、TAB、|同时做为分隔符。 

awk -F '[][]' '{print $1}' file 按照正则表达式的值做为分隔符,这里代表[、] 

5、awk -f awkfile file 通过文件awkfile的内容依次进行控制。 

cat awkfile 

/101/{print "\047 Hello! \047"} --遇到匹配行以后打印 ' Hello! '.\047代表单引号。 

{print $1,$2} --因为没有模式控制,打印每一行的前两个域。 

6、awk '$1 ~ /101/ {print $1}' file 显示文件中第一个域匹配101的行(记录)。 

7、awk 'BEGIN { OFS="%"} 

{print $1,$2}' file 通过设置输出分隔符(OFS="%")修改输出格式。 

8、awk 'BEGIN { max=100 ;print "max=" max} BEGIN 表示在处理任意行之前进行的操作。 

{max=($1 >max ?$1:max); print $1,"Now max is "max}' file 取得文件第一个域的最大值。 

(表达式1?表达式2:表达式3 相当于: 

if (表达式1) 

表达式2 

else 

表达式3 

awk '{print ($1>4 ? "high "$1: "low "$1)}' file 

9、awk '$1 * $2 >100 {print $1}' file 显示文件中第一个域匹配101的行(记录)。 

10、awk '{$1 == 'Chi' {$3 = 'China'; print}' file 找到匹配行后先将第3个域替换后再显示该行(记录)。 

awk '{$7 %= 3; print $7}' file 将第7域被3除,并将余数赋给第7域再打印。 

11、awk '/tom/ {wage=$2+$3; printf wage}' file 找到匹配行后为变量wage赋值并打印该变量。 

12、awk '/tom/ {count++;} 

END {print "tom was found "count" times"}' file END表示在所有输入行处理完后进行处理。 

13、awk 'gsub(/\$/,"");gsub(/,/,""); cost+=$4; 

END {print "The total is $" cost>"filename"}' file gsub函数用空串替换$和,再将结果输出到filename中。

1 2 3 $1,200.00 

1 2 3 $2,300.00 

1 2 3 $4,000.00 



awk '{gsub(/\$/,"");gsub(/,/,""); 

if ($4>1000&&$4<2000) c1+=$4; 

else if ($4>2000&&$4<3000) c2+=$4; 

else if ($4>3000&&$4<4000) c3+=$4; 

else c4+=$4; } 

END {printf "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file 

通过if和else if完成条件语句 



awk '{gsub(/\$/,"");gsub(/,/,""); 

if ($4>3000&&$4<4000) exit; 

else c4+=$4; } 

END {printf "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file 

通过exit在某条件时退出,但是仍执行END操作。 

awk '{gsub(/\$/,"");gsub(/,/,""); 

if ($4>3000) next; 

else c4+=$4; } 

END {printf "c4=[%d]\n",c4}"' file 

通过next在某条件时跳过该行,对下一行执行操作。 





14、awk '{ print FILENAME,$0 }' file1 file2 file3>fileall 把file1、file2、file3的文件内容全部写到fileall中,格式为

打印文件并前置文件名。 

15、awk ' $1!=previous { close(previous); previous=$1 } 

{print substr($0,index($0," ") +1)>$1}' fileall 把合并后的文件重新分拆为3个文件。并与原文件一致。 

16、awk 'BEGIN {"date"|getline d; print d}' 通过管道把date的执行结果送给getline,并赋给变量d,然后打印。 

17、awk 'BEGIN {system("echo \"Input your name:\\c\""); getline d;print "\nYour name is",d,"\b!\n"}'

通过getline命令交互输入name,并显示出来。 

awk 'BEGIN {FS=":"; while(getline< "/etc/passwd" >0) { if($1~"050[0-9]_") print $1}}'

打印/etc/passwd文件中用户名包含050x_的用户名。

18、awk '{ i=1;while(i<NF) {print NF,$i;i++}}' file 通过while语句实现循环。 

awk '{ for(i=1;i<NF;i++) {print NF,$i}}' file 通过for语句实现循环。 

type file|awk -F "/" ' 

{ for(i=1;i<NF;i++) 

{ if(i==NF-1) { printf "%s",$i } 

else { printf "%s/",$i } }}' 显示一个文件的全路径。 

用for和if显示日期 

awk 'BEGIN { 

for(j=1;j<=12;j++) 

{ flag=0; 

printf "\n%d月份\n",j; 

for(i=1;i<=31;i++) 



if (j==2&&i>28) flag=1; 

if ((j==4||j==6||j==9||j==11)&&i>30) flag=1; 

if (flag==0) {printf "%02d%02d ",j,i} 





}' 

19、在awk中调用系统变量必须用单引号,如果是双引号,则表示字符串 

Flag=abcd 

awk '{print '$Flag'}' 结果为abcd 

awk '{print "$Flag"}' 结果为$Flag

BEGIN和END,这两者都可用于pattern中(参考前面的awk语法),提供BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作。

任何在BEGIN之后列出的操作(在{}内)将在awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。

例:累计销售文件xs中的销售金额(假设销售金额在记录的第三字段):

$awk

'BEGIN { FS=":";print "统计销售金额";total=0}

{print $3;total=total+$3;}

END {printf "销售金额总计:%.2f",total}' sx

(注:>是shell提供的第二提示符,如要在shell程序Unix awk语句和Unix awk语言中换行,则需在行尾加反斜杠)

在这里,BEGIN预置了内部变量FS(字段分隔符)和自定义变量total,同时在扫描之前显示出输出行头。而END则在扫描完成后打印出总合计。

这篇很好http://manual.blog.51cto.com/3300438/932958


以下引自:http://www.cnblogs.com/zhuyp1015/archive/2012/07/11/2586985.html

awk 也是一个非常棒的数据处理工具!sed常常用于一整个行的处理, awk则比较倾向于一行当中分成数个『栏位』(或者称为一个域,也就是一列)来处理。因此,awk相当的适合处理小型的数据数据处理呢!awk通常运行的模式是这样的:

[root@www~]# awk '条件类型1{动作1} 条件类型2{动作2} ...' filename

awk 后面接两个单引号并加上大括号 {}来配置想要对数据进行的处理动作。 awk可以处理后续接的文件,也可以读取来自前个命令的
standard output。但如前面说的, awk主要是处理『每一行的栏位内的数据』,而默认的『栏位的分隔符号为 "空白键"或
"[tab]键"』!举例来说,我们用 last可以将登陆者的数据取出来,结果如下所示:

[root@www~]# last -n 5 <==仅取出前五行

root     pts/1  192.168.1.100  Tue Feb 1011:21   still logged in

root     pts/1  192.168.1.100  Tue Feb 10 00:46 -02:28  (01:41)

root     pts/1  192.168.1.100  Mon Feb  9 11:41 - 18:30  (06:48)

dmtsai   pts/1  192.168.1.100  Mon Feb  9 11:41 - 11:41  (00:00)

root     tty1                   Fri Sep  5 14:09 - 14:10  (00:01)

 

若我想要取出帐号与登陆者的 IP,且帐号与 IP之间以 [tab]
隔开,则会变成这样:

[root@www~]# last -n 5 | awk '{print $1 "\t" $3}'

root    192.168.1.100

root    192.168.1.100

root    192.168.1.100

dmtsai  192.168.1.100

root    Fri

上表是 awk
最常使用的动作!透过 print
的功能将栏位数据列出来!栏位的分隔则以空白键或 [tab]按键来隔开。因为不论哪一行我都要处理,因此,就不需要有 "条件类型"的限制!我所想要的是第一栏以及第三栏,但是,第五行的内容怪怪的~这是因为数据格式的问题啊!所以罗~使用
awk的时候,请先确认一下你的数据当中,如果是连续性的数据,请不要有空格或 [tab]在内,否则,就会像这个例子这样,会发生误判喔!

另外,由上面这个例子你也会知道,在每一行的每个栏位都是有变量名称的,那就是 $1, $2...等变量名称。以上面的例子来说, root是
$1 ,因为他是第一栏嘛!至於 192.168.1.100是第三栏,所以他就是 $3啦!后面以此类推~呵呵!还有个变量喔!那就是
$0,$0
代表『一整列数据』的意思~以上面的例子来说,第一行的 $0代表的就是『root ....』那一行啊!由此可知,刚刚上面五行当中,整个
awk的处理流程是:

1.   读入第一行,并将第一行的数据填入 $0, $1, $2....等变量当中;

2.   依据 "条件类型"的限制,判断是否需要进行后面的
"动作";

3.   做完所有的动作与条件类型;

4.   若还有后续的『行』的数据,则重复上面 1~3的步骤,直到所有的数据都读完为止。

经过这样的步骤,你会晓得, awk是『以行为一次处理的单位』,而『以栏位为最小的处理单位』。好了,那么 awk怎么知道我到底这个数据有几行?有几栏呢?这就需要
awk的内建变量的帮忙啦~

变量名称

代表意义

NF

每一行 ($0)拥有的栏位总数

NR

目前 awk所处理的是『第几行』数据

FS

目前的分隔字节,默认是空白键

我们继续以上面 last -n 5的例子来做说明,如果我想要:

·        列出每一行的帐号(就是 $1);

·        列出目前处理的行数(就是 awk内的
NR 变量)

·        并且说明,该行有多少栏位(就是 awk内的
NF 变量)

则可以这样:

Tips:要注意喔,awk 后续的所有动作是以单引号『 ' 』括住的,由於单引号与双引号都必须是成对的, 所以, awk 的格式内容如果想要以 print 列印时,记得非变量的文字部分,包含上一小节 printf 提到的格式中,都需要使用双引号来定义出来喔!因为单引号已经是
awk 的命令固定用法了!

[root@www ~]# last-n 5| awk '{print $1 "\t lines: " NR "\t columns: " NF}'

root     lines: 1        columns: 10

root     lines: 2        columns: 10

root     lines: 3        columns: 10

dmtsai   lines: 4        columns: 10

root     lines: 5        columns: 9

# 注意喔,在 awk内的 NR,NF 等变量要用大写,且不需要有钱字号 $ 啦!

这样可以了解 NR与 NF的差别了吧?好了,底下来谈一谈所谓的 "条件类型"了吧!

注:$0表示整行,$1代表第一项


·        awk的逻辑运算字节

既然有需要用到 "条件"的类别,自然就需要一些逻辑运算罗~例如底下这些:

运算单元

代表意义

>

大於

<

小於

>=

大於或等於

<=

小於或等於

==

等於

!=

不等於

值得注意的是那个『 == 』的符号,因为:

·        逻辑运算上面亦即所谓的大於、小於、等於等判断式上面,习惯上是以『 == 』来表示;

·        如果是直接给予一个值,例如变量配置时,就直接使用 =而已。

好了,我们实际来运用一下逻辑判断吧!举例来说,在 /etc/passwd当中是以冒号 ":"来作为栏位的分隔,该文件中第一栏位为帐号,第三栏位则是
UID以下的数据,并且仅列出帐号与第三栏,那么可以这样做:

[root@www~]# cat /etc/passwd | \

>awk '{FS=":"} $3 < 10 {print $1 "\t " $3}'

root:x:0:0:root:/root:/bin/bash

bin      1

daemon   2

....(以下省略)....

有趣吧!不过,怎么第一行没有正确的显示出来呢?这是因为我们读入第一行的时候,那些变量 $1, $2...默认还是以空白键为分隔的,所以虽然我们定义了 FS=":"了,但是却仅能在第二行后才开始生效。那么怎么办呢?我们可以预先配置
awk的变量啊!利用 BEGIN这个关键字喔!这样做:

[root@www~]# cat /etc/passwd | \

>awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'

root     0

bin      1

daemon   2

......(以下省略)......

很有趣吧!而除了 BEGIN之外,我们还有 END呢!另外,如果要用 awk来进行『计算功能』呢?以底下的例子来看,假设我有一个薪资数据表档名为
pay.txt,内容是这样的:

Name    1st    2nd     3th

VBird   23000  24000   25000

DMTsai  21000  20000   23000

Bird2   43000  42000   41000

如何帮我计算每个人的总额呢?而且我还想要格式化输出喔!我们可以这样考虑:

·        第一行只是说明,所以第一行不要进行加总 (NR==1时处理);

·        第二行以后就会有加总的情况出现 (NR>=2以后处理)

[root@www~]# cat pay.txt | \

>awk 'NR==1{printf "%10s %10s %10s %10s%10s\n",$1,$2,$3,$4,"Total" }

NR>=2{total= $2 + $3 + $4

printf"%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'

      Name        1st        2nd        3th     Total

     VBird     23000      24000      25000  72000.00

    DMTsai     21000      20000      23000  64000.00

     Bird2     43000      42000      41000 126000.00

上面的例子有几个重要事项应该要先说明的:

·        awk的命令间隔:所有 awk的动作,亦即在 {}内的动作,如果有需要多个命令辅助时,可利用分号『;』间隔, 或者直接以
[Enter]按键来隔开每个命令
,例如上面的范例中,鸟哥共按了三次 [enter]喔!

·        逻辑运算当中,如果是『等於』的情况,则务必使用两个等号『==』!

·        格式化输出时,在 printf的格式配置当中,务必加上 \n,才能进行分行!

·        与 bash shell的变量不同,在 awk当中,变量可以直接使用,不需加上
$符号。

利用 awk这个玩意儿,就可以帮我们处理很多日常工作了呢!真是好用的很~此外, awk的输出格式当中,常常会以 printf 来辅助,所以,最好你对
printf 也稍微熟悉一下比较好啦!另外, awk的动作内 {}也是支持 if (条件)的喔!举例来说,上面的命令可以修订成为这样:

[root@www~]# cat pay.txt | \

>awk '{if(NR==1) printf "%10s %10s %10s %10s%10s\n",$1,$2,$3,$4,"Total"}

NR>=2{total= $2 + $3 + $4

printf"%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'

awk:快速入门(简单实用19例+鸟哥书内容)的更多相关文章

  1. ELK系列(1) - Elasticsearch + Logstash + Kibana + Log4j2快速入门与搭建用例

    前言 最近公司分了个ELK相关的任务给我,在一边学习一边工作之余,总结下这些天来的学习历程和踩坑记录. 首先介绍下使用ELK的项目背景:在项目的数据库里有个表用来存储消息队列的消费日志,这些日志用于开 ...

  2. 拒绝从入门到放弃_《鸟哥的 Linux 私房菜 — 基础学习篇(第三版)》必读目录

    目录 目录 前言 关于这本书 必看知识点 最后 前言 相信部分刚进入这个行业的新同学会对一个问题感到疑惑,为什么从培训学校出来的学员不被欢迎? 这里记录下一些我个人的看法(博主也曾有面试新员工的经历) ...

  3. Jmeter 快速入门--简单的http压测

    1.添加线程组 打开jmeter主窗口后,选择左侧树形结构里的"测试计划",然后右键选择添加,选择"threads(users)",选择"线程组&qu ...

  4. 【转载】Spring学习(1)——快速入门--2019.05.19

    原文地址:https://www.cnblogs.com/wmyskxz/p/8820371.html   认识 Spring 框架 Spring 框架是 Java 应用最广的框架,它的成功来源于理念 ...

  5. H5新手快速入门 简单布局

    布局*{ margin: 0; padding: 0;}.quan{ width: 100%; height: 2000px; background: black url("../ima/b ...

  6. [转载]npm 与 package.json 快速入门教程

    npm 与 package.json 快速入门教程 2017-08-02 19:16:20 拭心 阅读数 78648更多 分类专栏: 学学前端   版权声明:本文为博主原创文章,遵循CC 4.0 BY ...

  7. vue 快速入门 系列 —— Vue 实例的初始化过程

    其他章节请看: vue 快速入门 系列 Vue 实例的初始化过程 书接上文,每次调用 new Vue() 都会执行 Vue.prototype._init() 方法.倘若你看过 jQuery 的源码, ...

  8. 【Python】【学习笔记】1.快速入门

    1.软件安装 从官网下载相应版本的安装包,一般不大. https://www.python.org/ 安装一路默认即可 2. 参考教程:快速入门:十分钟学会Python 本文的内容介于教程(Totur ...

  9. 每周一书-《鸟哥的Linux私房菜基础学习篇(第四版)》台湾原版,你想要吗?

     首先说明,本周活动有效时间为2016年10月19日到2016年10月31日.   目在介绍这本书之前,首先要感谢QQ号为:1084830483(路在远方),来自哈尔滨工程大学的同学赠送给玄魂工作室的 ...

随机推荐

  1. MySQl之最全且必会的sql语句

    创建一个名称为mydb1的数据库,如果有mydb1数据库则直接使用,如果无则创建mydb1数据库 create database if not exists mydb1; create databas ...

  2. Spring消息之JMS.

    一.概念 异步消息简介 与远程调用机制以及REST接口类似,异步消息也是用于应用程序之间通信的. RMI.Hessian.Burlap.HTTP invoker和Web服务在应用程序之间的通信机制是同 ...

  3. RESTful Console Application

    RESTful Console Application Introduction Inspirited by RESTFul architecture, A console application t ...

  4. word_count

    网址:http://www.wimoney.xin/HTML/upload.html 在我的网站上干不起,不晓得是不是文件保存的问题,也可能是windows和linux有些地方有差异,妈个鸡,我得再去 ...

  5. ubuntu 修改计算机名

    ubuntu装好系统之后打开终端,命令行前边会有一长串名字,看起来好烦(格式为:用户名@计算机名:~$),所以改计算机名: 需要改两个文件: sudo gedit /etc/hostname sudo ...

  6. ACM Least Common Multiple

    The least common multiple (LCM) of a set of positive integers is the smallest positive integer which ...

  7. PHP 字符串变量

    PHP 字符串变量 字符串变量用于存储并处理文本. PHP 中的字符串变量 字符串变量用于包含有字符的值. 在创建字符串之后,我们就可以对它进行操作了.您可以直接在函数中使用字符串,或者把它存储在变量 ...

  8. JavaScript 函数定义

    JavaScript 使用关键字 function 定义函数. 函数可以通过声明定义,也可以是一个表达式. 函数声明 在之前的教程中,你已经了解了函数声明的语法 : function function ...

  9. Python3 JSON 数据解析

    JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. Python3 中可以使用 json 模块来对 JSON 数据进 ...

  10. 20160226.CCPP体系详解(0036天)

    程序片段(01):01.多线程.c+02.多线程操作.c 内容概要:多线程 ///01.多线程.c #include <stdio.h> #include <stdlib.h> ...