仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1456|回复: 8
打印 上一主题 下一主题

[shell编程] 带来一篇Shell剧本之awk详解

[复制链接]
乐观 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-14 20:21:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的好朋友们!Shell剧本之awk详解
一.基础先容
1.awk:
awk是一个壮大的文天职析工具,在对文本文件的处置和天生报表,awk是无可替换的。awk以为文本文件都是布局化的,它将每个输出行界说为一个纪录,行中的每一个字符串界说为一个域(段),域和域之间利用支解符支解。


2.功效:流把持、数学运算、历程把持、内置的变量和函数、轮回和判别


3.事情道理:
awk会把每行举行一个拆分,用响应的下令对拆分出来的“段”举行处置。
(1)行事情形式,读进文件的每行,会把一行的内容,存到$0里
(2)利用内置的变量FS(段的分开符,默许用的是空缺字符),支解这一行,把支解出来的每一个段存到响应的变量$(1-100)
(3)输入的时分依照内置变量OFS(outFS),输入
(4)读进下一行持续操纵
复杂实例
[root@tx3~]#echo"thisisabook">awk.txt
[root@tx3~]#awk{print$2,$1,$3,$4}awk.txt
isthisabook


4.Awk经常使用内置变量表:
1$0以后纪录(作为单个变量)
2$1~$n以后纪录的第n个字段,字段间由FS分开
3FS输出字段分开符默许是空格
4NF以后纪录中的字段个数,就是有几列
5NR已读出的纪录数,就是行号,从1入手下手
6RS输出的纪录他隔符默以为换行符
7OFS输入字段分开符默许也是空格
8ORS输入的纪录分开符,默许为换行符
9ARGC下令行参数个数
10ARGV下令行参数数组
11FILENAME以后输出文件的名字
12IGNORECASE假如为真,则举行疏忽巨细写的婚配
13ARGIND以后被处置文件的ARGV标记符
14CONVFMT数字转换格局%.6g
15ENVIRONUNIX情况变量
16ERRNOUNIX体系毛病动静
17FIELDWIDTHS输出字段宽度的空缺分开字符串
18FNR以后纪录数
19OFMT数字的输入格局%.6g
20RSTART被婚配函数婚配的字符串首
21RLENGTH被婚配函数婚配的字符串长度


二.print的复杂利用
例:打印整行:$0
[root@tx3~]#cp/etc/passwdp1
[root@tx3~]#awk{print$0}p1


例:打印每行的最初一个字段:$NF
[root@tx3~]#awk-F:{print$NF}p1


例:打印第三个字段:$3
[root@tx3~]#awk-F:{print$3}p1


例:打印第一行NR==1
[root@tx3~]#awkNR==1{print$0}p1
root:x:0:0:root:/root:/bin/bash


例:打印最初一行
[root@tx3~]#awkEND{print$0}p1
tx:x:500:500:tx:/home/tx:/bin/bash


例:打印第一行最初一个字段
[root@tx3~]#awk-F:NR==1{print$NF}p1
/bin/bash


例:打印最初一行最初一个字段
[root@tx3~]#awk-F:END{print$NF}p1


例:打印每行的倒数第二个字段,并在厥后打印你好
[root@tx3~]#awk-F:{print$(NF-1),"nihao"}p1
/rootnihao
/binnihao
/sbinnihao


例:打印行号
[root@tx3~]#awk{printNR,$0}p1
1root:x:0:0:root:/root:/bin/bash
2bin:x:1:1:bin:/bin:/sbin/nologin
3daemon:x:2:2:daemon:/sbin:/sbin/nologin


例:打印以后体系情况变量的某个特定值
[root@tx3~]#awkBEGIN{printENVIRON["PATH"];}
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin


例:用:支解,删除第2个字段
[root@tx3~]#awkBEGIN{FS=":";OFS=":"}{print$1,$3,$4,$5,$6,$7}p1
root:0:0:root:/root:/bin/bash
bin:1:1:bin:/bin:/sbin/nologin
daemon:2:2:daemon:/sbin:/sbin/nologin


三.printf的利用


printformat天生报表
%d十进制有标记整数
%u十进制无标记整数
%f浮点数
%s字符串
%c显现字符的ASCII码
%p指针的值
%e迷信手艺法显现数值
%x%X无标记以十六进制暗示的整数
%o无标记以八进制暗示的整数
%g%G以迷信计数法或浮点数的格局显现数值
%%显现其本身
润色符:
-:左对齐
+:显现数值标记
N:显现


-F指定段的分开符
例:(1)天生报表




例:(2)小数成绩
对小数取保存位的时分,四舍五进
对小数取整,不举行四舍五进
[root@tx3~]#catawk.1
23.345611.23445.67
[root@tx3~]#awk{printf"%.2f        %.2f        %.2f
",$1,$2,$3}awk.1

23.3511.2345.67


四.awk的利用


(1)正则表达式
(){}不撑持
.*^$?+[]|<>()能够间接利用


例[root@tx3~]#awk/^$/{print"thisisanemptyline"}/etc/inittab
thisisanemptyline
thisisanemptyline
thisisanemptyline
thisisanemptyline
thisisanemptyline
thisisanemptyline
thisisanemptyline
thisisanemptyline
thisisanemptyline


例[root@tx3~]#awk-F:/^root/{print$1,$NF}/etc/passwd
root/bin/bash


例[root@tx3~]#awk-F:!/^root/{print$1,$NF}/etc/passwd|head-3
bin/sbin/nologin
daemon/sbin/nologin
adm/sbin/nologin


(2)干系运算符
><==!=>=<=
~(婚配)!~(不婚配)
例[root@tx3~]#cp/etc/passwdp1
[root@tx3~]#awk-F:$3==0{print$1}p1
Root


例[root@tx3~]#awk-F:$3!=0{print$1}p1|head-2
bin
Daemon


例[root@tx3~]#awk-F:$3<2{print$1}p1
root
bin


(3)逻辑运算符
&&||!
与或非
例[root@tx3~]#awk-F:$3>0&&$3<10{print$1,$3}p1|head-2
bin1
daemon2


例[root@tx3~]#awk-F:$3>10||$3<5{print$1,$3}p1|head-6
root0
bin1
daemon2
adm3
lp4
operator11


(4)算数运算符
+-*/%(取模(余数))^(幂运算)


例:输入名字,总成就,均匀成就
[root@tx3~]#catcj
tx908686
tx1897885
tx2798085


[root@tx3~]#awk{print$1,$2+$3+$4,($2+$3+$4)/3}cj
tx26287.3333
tx125284
tx224481.3333


[root@tx3~]#awk{printf"%-5s%3d%.2f
",$1,$2+$3+$4,($2+$3+$4)/3}cj

tx26287.33
tx125284.00
tx224481.33


(5)BEGINEND
BEGIN{举措;举措;...}在处置文件之前,要实行的举措;只实行一次
END{举措;举措;...}在处置完文件以后,要实行的举措;只实行一次
BEGIN:能够给文件增加题目、界说变量、界说文件的分开符
END:汇总的操纵
getline能够从管道和尺度输出读取输出,然后传送给变量。


例:
[root@tx3~]#awkBEGIN{"date"|getlinea}{print}END{printa}cj
tx908686
tx1897885
tx2798085
ThuFeb712:39:25CST2013


五.awk里的流把持和轮回
(1)复杂的前提判别
语法:(表达式?值1:值2)假如表达式建立,输入值1;不然输入值2
[root@tx3~]#catnum
289
846
357
[root@tx3~]#awk{print($1>$2?$1:$2)}num
8
8
5


(2)if判别
语法:
{if(表达式
{
举措1;举措2;...
}
}
假如表达式建立,那末实行举措。
[root@tx3~]#awk{if($2>=80&&$2<=100){print$1,"great"}else{print$1,"good"}}cj
txgreat
tx1great
tx2good
(2)多支判别


{
if(表达式)
{举措1;举措2;...}
elseif(表达式)
{举措1;举措2;...}
elseif(表达式)
{举措1;举措2;...}
......
else
{举措1;举措2;...}
}


[root@tx3~]#catcj
tx908686
tx1897885
tx2798085
tx3807060
tx4758565
tx5786280


判别的尺度:
90-100A
80-89B
70-79C
60-69D
0-59E
[root@tx3~]#awk{if($2>=90&&$2<=100){print$1,"A"}elseif($2>=80&&$2<90){print$1,"B"}elseif($2>=70&&$2<80){print$1,"C"}elseif($2>=60&&$2<70){print$1,"D"}else{print$1,"E"}}cj
txA
tx1B
tx2C
tx3B
tx4C
tx5C
(3)轮回while


语法:var=初值;while(表达式){举措1;...更新变量的举措;}
例:
[root@tx3~]#awk-F:{i=1;while(i<=NF){print$i;i++}}p1|head-7
root
x
0
0
root
/root
/bin/bash


例.***一
[root@tx3~]#awk-F:{i=NF;while(i>=2){printf$i":";i--};print$1}p1
/bin/bash:/root:root:0:0:x:root
/sbin/nologin:/bin:bin:1:1:x:bin
/sbin/nologin:/sbin:daemon:2:2:x:daemon
/sbin/nologin:/var/adm:adm:4:3:x:adm


例.***二
[root@tx3~]#awkBEGIN{FS=":"}{i=NF;while(i>=2){printf$i":";i--}print$1}p1
/bin/bash:/root:root:0:0:x:root
/sbin/nologin:/bin:bin:1:1:x:bin
/sbin/nologin:/sbin:daemon:2:2:x:daemon


(4)for轮回


语法:
{
for(表达式)
{举措1;...}
}
表达式:分为3局部:
(1)初始化表达式i=1
(2)测试表达式i<10
(3)更新测试表达式i++
语句:
next处置输出行的下一个输出行
exit加入
continue停止本次轮回
break跳出轮回





[root@tx3~]#awkBEGIN{FS=":"}{for(i=NF;i>=2;i--){printf$i";"};print$1}p1
/bin/bash;/root;root;0;0;x;root
/sbin/nologin;/bin;bin;1;1;x;bin
/sbin/nologin;/sbin;daemon;2;2;x;daemon
/sbin/nologin;/var/adm;adm;4;3;x;adm



[root@tx3~]#catnum
289
846
357
[root@tx3~]#awk{max=0;i=1;while(i<=NF){if(max<$i){max=$i}i++}printmax}num
9
8
7


(5)awk数组






例利用变量作为数组下标



别的一种读取体例(这类是无序的,j是变量,a是数组)





数组有序





(6)函数
@1split切割字符串
split("守候被切割的字符串",数组名,"切割用的分开符")
[root@tx3~]#awkBEGIN{split("2012/08/23",da,"/");printda[2],da[3],da[1]}
08232012


@2toupper()小写转年夜写
tolower()年夜写转小写
[root@tx3~]#awk{printtoupper($0)}p1|head-3
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN


@3sub()部分交换
gsub()全局交换
sub(/要交换的内容/,"交换成甚么内容")
gsub(/要交换的内容/,"交换成甚么内容")
gsub(/要交换的内容/,"交换成甚么内容",指定字段如$7)
例:
[root@tx3~]#awk-F:{sub(/root/,"r00t");print}p1
r00t:x:0:0:root:/root:/bin/bash


例:
[root@tx3~]#awk-F:{gsub(/root/,"r00t");print}p1
r00t:x:0:0:r00t:/r00t:/bin/bash
operator:x:11:0:operator:/r00t:/sbin/nologin


例:
[root@tx3~]#awk-F[:/]{gsub(/root/,"r00t",$7);print}p1
rootx00rootr00tbinbash
operatorx110operatorr00tsbinnologin


@4.length()盘算字符串的长度
[root@tx3~]#awk-F:{printlength($1),$1}p1
4root
3bin
6daemon
3adm


@5.数学盘算
[root@tx3~]#awkBEGIN{printsin(30)}
-0.988032
[root@tx3~]#awkBEGIN{printcos(60)}
-0.952413
[root@tx3~]#awkBEGIN{printint(22/6)}
3
[root@tx3~]#awkBEGIN{printsqrt(3)}
1.73205
欢迎大家来到仓酷云论坛!
深爱那片海 该用户已被删除
沙发
发表于 2015-1-16 10:47:32 | 只看该作者

带来一篇Shell剧本之awk详解

随着IT从业人员越来越多,理论上会有更多的人使用Linux,可以肯定,Linux在以后这多时间不会消失。
山那边是海 该用户已被删除
板凳
发表于 2015-1-21 06:09:30 | 只看该作者
直到学习Linux这门课以后,我才知道,原来我错了。?
分手快乐 该用户已被删除
地板
发表于 2015-1-30 09:39:26 | 只看该作者
对我们学习操作系统有很大的帮助,加深我们对OS的理解。?
简单生活 该用户已被删除
5#
发表于 2015-2-16 00:49:34 | 只看该作者
感谢老师和同学们在学习上对我的帮助。
变相怪杰 该用户已被删除
6#
发表于 2015-3-4 22:26:28 | 只看该作者
有疑问前,知识学习前,先用搜索。
因胸联盟 该用户已被删除
7#
发表于 2015-3-11 21:53:28 | 只看该作者
在系统检测不到与Linux兼容的显卡,那么此次安装就可能不支持图形化界面安装,而只能用文本模式安装等等。
精灵巫婆 该用户已被删除
8#
发表于 2015-3-19 16:22:35 | 只看该作者
熟读写基础知识,学得会不如学得牢。
乐观 该用户已被删除
9#
 楼主| 发表于 2015-3-29 21:53:19 | 只看该作者
可以说自己收获很大,基本上完成了老师布置的任务,对于拔高的题目没有去做,因为我了解我的水平,没有时间和精力去做。?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 04:22

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表