shell脚本三剑客之awk命令


awk:
测试用模版:M.Tansley 05/99 48311 Green 8 40 44.44J.Lulu 06/99 48317 green 9 24 2678.P.Bunnyaaa 02/99 48 Yellow 12 35 2658J.Troll 07/99 4842 Brown-3 12 26 266666L.Tansleyaaa 05/99 4712 Brown-2 12 30 44544

模式和动作: 最常用的动作是打印(print)也有较长的动作代码if和while和for, 模式可以是任何条件语句或复合语句或正则表达式也包括两个特殊字段BEGIN和END。BEGIN的使用是在awk正式对文本做读取操作之前,END则是在awk在做完所有操作之后
awk脚本的输入方法:脚本名(test.awk) 文件名(abc.txt)正规使用方法为方法一方法一:test.awk abc.txt方法二:test.awk
方法三:abc.txt | test.awk
awk使用时出现错误的原因:确保整个awk命令用单引号括起来。确保命令内所有引号成对出现。确保用花括号括起动作语句,用圆括号括起条件语句。可能忘记使用花括号,也许你认为没有必要,但awk不这样认为,将按之解释语法。
NR:表示awk开始执行程序后所读取的数据行数例:[root@localhost awk]# awk ‘{print NR}’ data.f 12345释:也可以在花括号前加入END字段,表示打印最后一行行数。
$NF:最后一列数据例:[root@localhost awk]# awk ‘{print $NF}’ data.f 44.442678.265826666644544释:可以在花括号前加入END,表示打印最后一行的最后一列。
保存输出:例:[root@localhost awk]# awk ‘{print $0}’ data.f |tee wowM.Tansley 05/99 48311 Green 8 40 44.44J.Lulu 06/99 48317 green 9 24 2678.P.Bunnyaaa 02/99 48 Yellow 12 35 2658J.Troll 07/99 4842 Brown-3 12 26 266666L.Tansleyaaa 05/99 4712 Brown-2 12 30 44544释:”$0″打印全行,tee是将管道符前面的结果保存到wow文件中同时标准输出在屏幕上。
打印报告头和结束尾:例:[root@localhost awk]# awk ‘BEGIN {print “name colorn————————“} {print $1,$4}’ data.f name color————————M.Tansley GreenJ.Lulu greenP.Bunnyaaa YellowJ.Troll Brown-3L.Tansleyaaa Brown-2释:”n“另起一行
例:[root@localhost awk]# awk ‘BEGIN {print “name colorn—————“} {print $1,$4} END {print “n———–jieshu”}’ data.fname color——————–M.Tansley GreenJ.Lulu greenP.Bunnyaaa YellowJ.Troll Brown-3L.Tansleyaaa Brown-2
—————jieshu
[root@localhost awk]# awk ‘BEGIN {print “nametcolor”} {print $1″t” $2}’ data.f name colorM.Tansley 05/99J.Lulu 06/99P.Bunnyaaa 02/99J.Troll 07/99L.Tansleyaaa 05/99释:”t“执行tab键
正则表达式:在awk中正则表达式是使用斜线来表示的,例如,查找Green字符可以这样表达”/Green/”,在awk中可以使用的元字符有如下; :转意符号,如果在命令中有特殊符号,但是不想用特殊符号的功能只需要在特殊符号前加转义符号。. :一位任意数[] :为查询大小写信息.() :使用条件语句需要用圆括号。* :多位任意数。^ :匹配模式头部分$ :匹配模式尾部分| :或? :匹配可能出现的字符+ :使用+匹配一个或多个字符
条件操作符:> :小于例:[root@localhost awk]# awk ‘$3
L.Tansleyaaa 05/99 4712 Brown-2 12 30 44544例:[root@localhost awk]# awk ‘{if($6 > $7) print $1 “tok”}’ data.f.bakJ.Troll ok
例:[root@localhost awk]# awk ‘$3
P.Bunnyaaa 02/99 48 Yellow 12 35 2658L.Tansleyaaa 05/99 4712 Brown-2 12 30 44544
== :等于例:[root@localhost awk]# awk ‘$3 == “48” {print $0}’ data.fP.Bunnyaaa 02/99 48 Yellow 12 35 2658
!= :不等于例:[root@localhost awk]# awk ‘$3 != “48” {print $0}’ data.fM.Tansley 05/99 48311 Green 8 40 44.44J.Lulu 06/99 48317 green 9 24 2678.J.Troll 07/99 4842 Brown-3 12 26 266666L.Tansleyaaa 05/99 4712 Brown-2 12 30 44544例:[root@localhost awk]# awk ‘$0 !~ /Brown/’ data.fM.Tansley 05/99 48311 Green 8 40 44.44J.Lulu 06/99 48317 green 9 24 2678.P.Bunnyaaa 02/99 48 Yellow 12 35 2658
>= :大于等于例:[root@localhost awk]# awk ‘$3 >= “48” {print $0}’ data.fM.Tansley 05/99 48311 Green 8 40 44.44J.Lulu 06/99 48317 green 9 24 2678.P.Bunnyaaa 02/99 48 Yellow 12 35 2658J.Troll 07/99 4842 Brown-3 12 26 266666
~ :匹配正则表达式例:[root@localhost awk]# awk ‘{if ($4~/Brown/) print $0}’ data.fJ.Troll 07/99 4842 Brown-3 12 26 266666L.Tansleyaaa 05/99 4712 Brown-2 12 30 44544例:[root@localhost awk]# awk ‘$0 ~/Brown/’ data.fJ.Troll 07/99 4842 Brown-3 12 26 266666L.Tansleyaaa 05/99 4712 Brown-2 12 30 44544

!~ :不匹配正则表达式例:[root@localhost awk]# awk ‘$0 !~/Brown/’ data.fM.Tansley 05/99 48311 Green 8 40 44.44J.Lulu 06/99 48317 green 9 24 2678.P.Bunnyaaa 02/99 48 Yellow 12 35 2658例:[root@localhost awk]# awk ‘{if ($4 !~/Brown/) print $0}’ data.fM.Tansley 05/99 48311 Green 8 40 44.44J.Lulu 06/99 48317 green 9 24 2678.P.Bunnyaaa 02/99 48 Yellow 12 35 2658
任意字符匹配:例:[root@localhost awk]# awk ‘$0~/^…a/ ‘ data.fM.Tansley 05/99 48311 Green 8 40 44.44L.Tansleyaaa 05/99 4712 Brown-2 12 30 44544释:匹配开头前三位是任意字符第四位是a的字段。
“或”的使用:例:[root@localhost awk]# awk ‘$0 ~ /(Brown|gree)/’ data.fJ.Lulu 06/99 48317 green 9 24 2678.J.Troll 07/99 4842 Brown-3 12 26 266666L.Tansleyaaa 05/99 4712 Brown-2 12 30 44544例;[root@localhost awk]# awk ‘$0 ~ /(Brown|[Gg]ree)/’ data.fM.Tansley 05/99 48311 Green 8 40 44.44J.Lulu 06/99 48317 green 9 24 2678.J.Troll 07/99 4842 Brown-3 12 26 266666L.Tansleyaaa 05/99 4712 Brown-2 12 30 44544
行首:例:[root@localhost awk]# awk ‘/^J/’ data.fJ.Lulu 06/99 48317 green 9 24 2678.J.Troll 07/99 4842 Brown-3 12 26 266666
符合模式:&& :两边的是都为真,才能打印信息。(只针对一行有效)例[root@localhost awk]# awk ‘{if ($3~/48/ && $4~/[Gg]reen/) print $0}’ data.fM.Tansley 05/99 48311 Green 8 40 44.44J.Lulu 06/99 48317 green 9 24 2678.
|| :一边为真或全部为真例:[root@localhost awk]# awk ‘{if ($0~/Brown/ || $4~/[Gg]reen/) print $0}’ data.fM.Tansley 05/99 48311 Green 8 40 44.44J.Lulu 06/99 48317 green 9 24 2678.J.Troll 07/99 4842 Brown-3 12 26 266666L.Tansleyaaa 05/99 4712 Brown-2 12 30 44544

awk内置变量:NR:文件行数NF:域块个数FILENAME:所指定的文件名例:[root@localhost awk]# awk ‘{print NR,NF,$0} END{print FILENAME}’ data.f1 7 M.Tansley 05/99 48311 Green 8 40 44.442 7 J.Lulu 06/99 48317 green 9 24 2678.3 7 P.Bunnyaaa 02/99 48 Yellow 12 35 26584 7 J.Troll 07/99 4842 Brown-3 12 26 2666665 7 L.Tansleyaaa 05/99 4712 Brown-2 12 30 44544data.f
例:[root@localhost awk]# echo $PWD |awk -F”/” ‘{print $NF}’awk
设置输入域到域变量名:例:[root@localhost awk]# awk ‘{name=$1;color=$4;if(color~/Ye/) print name “tok”}’ data.fP.Bunnyaaa ok释:注意分号的使用,它分隔 awk命令。
为变量赋值:例:[root@localhost awk]# awk ‘{if ($6
J.Lulu 06/99 48317 green 9 24 2678.J.Troll 07/99 4842 Brown-3 12 26 266666
例:[root@localhost awk]# awk ‘BEGIN{shuzi=”27 “} {if ($6
J.Lulu 06/99 48317 green 9 24 2678.J.Troll 07/99 4842 Brown-3 12 26 266666释:通常在BEGIN部分赋值是很有益的,可以在awk表达式进行改动时减少很多麻烦。
修改数值域取值:例:[root@localhost awk]# awk ‘{if ($1==”M.Tansley”) $6=$6-1;print $1,$6,$7}’ data.fM.Tansley 39 44.44J.Lulu 24 2678.P.Bunnyaaa 35 2658J.Troll 26 266666L.Tansleyaaa 30 44544释:M.Tansley从原来的40下降到39。
例:[root@localhost awk]# awk ‘{if ($1==$1) $6=$6-1;print $1,$6,$7}’ data.fM.Tansley 39 44.44J.Lulu 23 2678.P.Bunnyaaa 34 2658J.Troll 25 266666L.Tansleyaaa 29 44544释:所有数字都减一。
修改文本域:例:[root@localhost awk]# awk ‘{if ($1==”P.Bunnyaaa”) ($1=”P.Bunnyaaa.abcaaa”);print $1}’ data.fM.TansleyJ.LuluP.Bunnyaaa.abcaaaJ.TrollL.Tansleyaaa释:记住字符串要使用双秒号( ” “)不要忘记分号(;) ,并用圆括号括起整个语法。
只显示修改记录:例:[root@localhost awk]# awk ‘{if ($1==”M.Tansley”) {$1=”M.Tansley.abc”;print $1}}’ data.fM.Tansley.abc例:[root@localhost awk]# awk ‘{if ($1==”M.Tansley”) {$1=”M.Tansley.abc”;print $0}}’ data.fM.Tansley.abc 05/99 48311 Green 8 40 44.44释:注意花括号的位置
创建新的输出域:例:[root@localhost awk]# awk ‘BEGIN{print “namet fenzhi”} {if ($5
name fenzhiM.Tansley 32J.Lulu 15P.Bunnyaaa 23J.Troll 14L.Tansleyaaa 18释:在输出结果前打印一个头,然后在比较数值,“$8=$6-$5”这是在为$8赋值。记住使用语法的格式。
例:[root@localhost awk]# awk ‘BEGIN{print “name t shuzi”} {if ($5
name shuziM.Tansley 32J.Lulu 15P.Bunnyaaa 23J.Troll 14L.Tansleyaaa -90释:也可以使用域变量名。
文件长度相加:例:[root@localhost awk]# ll -h |awk ‘/^[^d]/ {print $8″t”$5} {tol+=$5} END{print “zongshu:” tol}’data.f 217data.f.bak 201zongshu:422释:数值相加的总和有偏差,应该是单位换算导致的结果有误。具体后期查一下。
替换(gsub):例:[root@localhost awk]# awk ‘gsub (/Green/,”abcd”) {print $0}’ data.fM.Tansley 05/99 48311 abcd 8 40 44.44释:整个记录中替换一个字符串为另一个,使用正则表达式格式, /目标模式/,替换模式
awk简单脚本:例:[root@localhost awk]# cat jiaoben#!/bin/awk -f#BEGIN{print “hello”print “chengjiruxia”print “====================================”
}(tot+=$6)END{pri免费云主机域名nt “zongshu:” totprint “pingjunshu” tot/NR}
释:要给awk脚本加权限chmod u+x jiaoben ,不能这样使用sh jiaoben data.f。释:tot/NR是tot总数除以行数(NR)例:[root@localhost awk]# ./jiaoben data.fhellochengjiruxia====================================M.Tansley 05/99 48311 Green 8 40 44.44J.Lulu 06/99 48317 green 9 24 2678.P.Bunnyaaa 02/99 48 Yellow 12 35 2658J.Troll 07/99 4842 Brown-3 12 26 266666L.Tansleyaaa 05/99 4712 Brown-2 120 30 44544zongshu:155pingjunshu31

例:[root@localhost awk]# awk ‘BEGIN{OFS=”:”}{print $1,$3,$4}’ digresult.txtnews.sina.com.cn:111.12.251.212:111.12.251.203jupiter.sina.com.cn:111.12.251.217:111.12.251.212cmnetnews.sina.com.cn:111.12.251.219:111.12.251.217us.sina.com.cn:111.12.251.212:111.12.251.203www.sina.com:111.12.251.212:111.12.251.203释:将打印的结果已冒号分隔又叫输出分隔符

相关推荐: Linux系统中怎么加密文件

这篇文章主要讲解了“Linux系统中怎么加密文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux系统中怎么加密文件”吧!在Linux系统安装时选择使用EFS首先将介绍一个非常简单的方法来使用EFS文件系…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 01/24 20:02
Next 01/24 20:02