linux三剑客---awk

1、介绍

        awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势

2、语法

awk [options] 'script' var=value file(s)

awk [options] -f scriptfile var=value file(s)

-F fs   fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:

-v var=value   赋值一个用户定义变量,将外部变量传递给awk

-f scripfile  从脚本文件中读取awk命令

-m[fr] val   对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目

2、awk工作原理

awk 'BEGIN{ commands } pattern{ commands } END{ commands }'

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

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

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

3、使用

echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }'

v1=v2=v3

cat a.js

1

2

3

awk 'BEGIN{print "start"} {a+=$1} END{print a}' b.js

start

6

4、内置变量

说明:[A][N][P][G]表示第一个支持变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk

$n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。

$0 这个变量包含执行过程中当前行的文本内容。

[N] ARGC 命令行参数的数目。

[G] ARGIND 命令行中当前文件的位置(从0开始算)。

[N] ARGV 包含命令行参数的数组。

[G] CONVFMT 数字转换格式(默认值为%.6g)。

[P] ENVIRON 环境变量关联数组。

[N] ERRNO 最后一个系统错误的描述。

[G] FIELDWIDTHS 字段宽度列表(用空格键分隔)。

[A] FILENAME 当前输入文件的名。

[P] FNR 同NR,但相对于当前文件。

[A] FS 字段分隔符(默认是任何空格)。

[G] IGNORECASE 如果为真,则进行忽略大小写的匹配。

[A] NF 表示字段数,在执行过程中对应于当前的字段数。

[A] NR 表示记录数,在执行过程中对应于当前的行号。

[A] OFMT 数字的输出格式(默认值是%.6g)。

[A] OFS 输出字段分隔符(默认值是一个空格)。

[A] ORS 输出记录分隔符(默认值是一个换行符)。

[A] RS 记录分隔符(默认是一个换行符)。

[N] RSTART 由match函数所匹配的字符串的第一个位置。

[N] RLENGTH 由match函数所匹配的字符串的长度。

[N] SUBSEP 数组下标分隔符(默认值是34)。

1)每行的最后一个值

echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $NF}'

f3

f5

echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $(NF-1)}'

f2

f4

2)每行的列数

echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print NF}'

3

3

3)传递参数

VAR=10000

echo | awk -v VARIABLE=$VAR '{ print VARIABLE }'

5、运算和判断


运算符

awk 'BEGIN{a="b";print a++,++a;}'

0 2

awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}'

1

注意:所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0

awk 'BEGIN{

    test=100;

    if(test>90){

        print "very good";

    } else if(test>60){

        print "good";

    } else{

        print "no pass";

    }

}'

very good

awk 'BEGIN{

for(k in ENVIRON){

print k"="ENVIRON[k];

}

}'

TERM=linuxG_BROKEN_FILENAMES=1SHLVL=1

pwd=/root/text...

logname=root

HOME=/root

SSH_CLIENT=192.168.1.21 53087 22

6、高级输入

cat a.js

a

b

c

d

e

awk 'NR%2==1{next}{print NR,$0;}' a.js

2 b

4 d

cat a.js:

web01[192.168.2.100]

httpd ok

tomcat ok

sendmail ok

web02[192.168.2.101]

httpd ok

postfix ok

web03[192.168.2.102]

mysqld ok

httpd ok

awk '/^web/{T=$0;next;}{print T":\t"$0;}' a.js

web01[192.168.2.100]: httpd okweb01[192.168.2.100]: tomcat okweb01[192.168.2.100]: sendmail okweb02[192.168.2.101]: httpd okweb02[192.168.2.101]: postfix okweb03[192.168.2.102]: mysqld okweb03[192.168.2.102]: httpd ok

执行shell的date命令,并通过管道输出给getline,然后getline从管道中读取并将输入赋值给out,split函数把变量out转化成数组mon,然后打印数组mon的第二个元素

awk 'BEGIN{ "date" | getline out; split(out,mon); print mon[1] }' test

2018年

awk 'BEGIN{info="it is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}'

2 is

3 a

4 test

1 it

awk 'BEGIN{OFMT="%.3f";fs=sin(1);fe=exp(10);fl=log(10);fi=int(3.1415);print fs,fe,fl,fi;}'0.841 22026.466 2.303 3


支持的函数


字符串函数


时间函数
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335

推荐阅读更多精彩内容