gawk--文本处理

gawk是 GNU的awk,具有很强的文本处理功能
awk对文本处理有很强的功能,对于文字档里的资料进行修改比对抽取

gawk主要功能是对档案的每一行搜寻指定的patterns,当一行有符合指定的patterns,gawk就会在此一行执行被指定的actions
gawk有很多patterns和action组成,action在大括号里面,一个pattern后面跟一个action
pattern {action}
pattern和action可以同时被省略,但是不能同时被省略
pattern省略,对于每一行action都会执行
action省略,内定action会打印出来所有符合pattern的输入行

执行gawk程序

#直接执行
gawk 'program' Input-file1 input-file2...
#程序写入文件
gawk -f program-file input-file1 input-file2...

#一个例子
gawk '/foo/ {print $0}' bbs-list.txt
#/foo/ 为pattern,搜寻输入档的每一行是否含有子字符串'foo'
#print $0表示将现在的这一行内容输出,$0表示整行

#另外一个例子
gawk '$1 == "Feb" {sum=$2+$3} END {print sum}' shiped
#$1表示文件的第一个栏位,$2和$3表示第二和第三个栏位
#END表示在所有的输入读完之后,执行一次print sum的动作```

###读取输入档案

gawk的输入可以从标准输入或者指定档案中提取
一般,一个记录为一行,字段之间以空格符分隔
gawk会把输入分解为记录,默认是一行,内建变量RS 默认值是"\n"
内建变量FNR会储存目前输入档案已经被读取的记录数
NR会储存目前为止所有输入档案已经被读取的记录数```

字段

#字段之间默认是以空格符分开的
#$NF表示一个记录的最后一个栏位
#NF是内建变量,表示目前这个记录的栏位个数
gawk '$1~/foo/ {print $0}' bbs-list.txt
#$1~/foo/表示将每个记录的第一个字段做检查,如果含有foo,这个字段将会被输出
#gawk使用field separator将记录分解为字段,内建变量FS表示
#使用 = 来改变FS的值
gawk 'BEGIN {FS=","}; {print $2}'
#BEGIN后面的action会在第一个记录被读取之前执行一次
#执行上面的后会等待输出```

###输出

print输出,更复杂的格式使用printf

print item1, item2...各个item之间会有空白分开,最后有一个换行符

直接print会输出一个record

要打印出空白行 print ""

打印文字 print "hello world"

Output Separators

可以使用任何字符串作为item之间的分隔,output field sepatator

OFS来设定,print输出完了之后会输出一个output record separator

ORS 默认值是 "\n" 换行

gawk 'BEGIN {OFS=";"; ORS="\n\n"} {print $1,$2}' bbs-list.txt

printf

精确控制输出格式,指定item的输出宽度,还有数字格式

printf format, item1, item2,...

另外printf 不会自动换行

printf "%4s","foo"```

patterns

只有pattern符合现在的输入记录,对应的action才会被执行
patterns的种类
/regular expression/
一个这个表达式被当成一个pattern,记录里面含有这个表达式就符合
expression
当一个值不为0或者一个字符串不是空的,就是符合
pat1,pat2
一对patterns以逗号分开,指定记录的范围
BEGIN
END
特别的pattern,在开始或者结束执行时,会执行其相对应的action
null
空pattern,对于每个输入记录都视为符合的pattern

/regular expression/
gawk '/foo/ {print $2}' bbs-list.txt
也可以使用比较
gawk '$1~/foo/ {print $0}' bbs-list.txt
gawk '$1!~/foo/ {print $0}' bbs-list.txt```

###比较算式

< <= > >= == !=
x~y表示x符合regular expression y 则结果是真
x!~y表示x不符合regular expression y 则结果为真```

布尔运算的patterns

|| && !
gawk '/2400/ && /foo/' bbs-list.txt
gawk '/2400/ || /foo/' bbs-list.txt
gawk '!/foo/' bbs-list.txt```

###算式运算
      • / % ^ **```

条件算式

selector ? if-true-exp:if-false-exp```

###控制语句

if(condition) then-body [else else-body]
if(x%2==0)
print "x is seven"
else
print "x is odd"

写成gawk就是(要用大括号把语句括起来)
gawk '{x=3
if(x%2==0)
print "x is seven"
else
print "x is odd"}'

while
gawk '{i=1
while(i<=3){
print i
i++
}}'

do-while
gawk '{i=1
do{
print i
i++
}while(i<=10)
}'

for
gawk '{for(i-1;i<=3;i++)
print i}'

break
break 会跳出循环的最内层
gawk '{num=$1
for(div=2;div*div<=num;div++)
if(num%div==0)
break
if(num%div!=0)
printf "Smallest divsor of %d is %d \n",num,div
else
printf "%d is prime\n",num}'

continue
gawk 'BEGIN{
for(x=0;x<=20;x++){
if(x==5)
continue
printf("%d",x)
}
print " "
}'

next,next file,exit
next 强迫立刻停止处理目前记录继续下一个记录
next file 停止处理目前的文件
exit 使得程序停止然后跳出,但是会执行END的action```

内建函数

index(str,find)
在字符串str里面,寻找find第一次出现的位置
length(string)
match(string,regexp)
寻找符合reg最长最靠左边的子字符串的index值
sprintf(format,exp1...)
sub(regrxp,replacement,target)
gsub(regexp,replacement,target)
寻找所有的符合地方,加以替换
substr(string,start,length)
tolower(string)
toupper(string)```

###输入输出的内建函数

close(filename)
system(command)
允许使用执行系统命令,执行完后回到gawk
BEGIN {system("ls")}```

定义函数

function name(parameter-list){
  body-of-function
}
{print "sum=",SquareSum($1,$2)}
function SquareSum(x,y){
  sum=x*x+y*y
  return sum
}```

###实例

NF表示栏位(字段个数)
FS表示字段间的间隔符,默认为空格
NR表示现在文件已经被读取的行数
FNR表示新打开一个文件,行数值就会从0开始计算
OFS表示列输出间隔符
gawk '{if(NF>max) max=NF}
END {print max}'

gawk 'length($0)>80'
这里会采用内定的print

gawk 'NF>0'
将文件中所有空白行删除,因为只输出非空白行

gawk '{if(NF>0) print}'
对至少有一个字段的所有行,输出

gawk 'BEGIN {for(i=1;i<=7;i++)
print int(101*rand())}'
输出0到100的7个随机值

ll -h | gawk '{x+=$5}; END {print "total Mbytes:" x}'

cat file | gawk '{if(x<length()) x=length()} END {print "maximum line length is ",x}'

gawk 'BEGIN {FS=":"} {print $1|"sort"}' /etc/passwd

gawk '{nlines++} END {print nlines}'
打印一个文件的总行数

gawk 'END {print NR}'
打印总行数

gawk '{print NR,$0}'
类似于cat -n```

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

推荐阅读更多精彩内容

  • awk: grep,sed,awk grep:文本过滤 sed:文本编辑 awk:文本格式化工具; 1 什么是aw...
    木林森阅读 1,769评论 0 16
  • 转载 原文的排版和内容都更加友好,并且详细,我只是在这里贴出了一部分留作自己以后参考和学习,如希望更详细了解AWK...
    XKirk阅读 3,197评论 2 25
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,150评论 2 34
  • awk:报告生成器,格式化文本输出 内容: awk介绍 awk基本用法 awk变量 awk格式化 awk操作符 a...
    BossHuang阅读 1,453评论 0 9
  • 知识点 sort uniq cut wc sed命令 awk命令 crontab定时器 sort sort 命令对...