带来一篇Shell剧本之awk详解
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的好朋友们!Shell剧本之awk详解一.基础先容
1.awk:
awk是一个壮大的文天职析工具,在对文本文件的处置和天生报表,awk是无可替换的。awk以为文本文件都是布局化的,它将每个输出行界说为一个纪录,行中的每一个字符串界说为一个域(段),域和域之间利用支解符支解。
2.功效:流把持、数学运算、历程把持、内置的变量和函数、轮回和判别
3.事情道理:
awk会把每行举行一个拆分,用响应的下令对拆分出来的“段”举行处置。
(1)行事情形式,读进文件的每行,会把一行的内容,存到$0里
(2)利用内置的变量FS(段的分开符,默许用的是空缺字符),支解这一行,把支解出来的每一个段存到响应的变量$(1-100)
(3)输入的时分依照内置变量OFS(outFS),输入
(4)读进下一行持续操纵
复杂实例
#echo"thisisabook">awk.txt
#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
#cp/etc/passwdp1
#awk{print$0}p1
例:打印每行的最初一个字段:$NF
#awk-F:{print$NF}p1
例:打印第三个字段:$3
#awk-F:{print$3}p1
例:打印第一行NR==1
#awkNR==1{print$0}p1
root:x:0:0:root:/root:/bin/bash
例:打印最初一行
#awkEND{print$0}p1
tx:x:500:500:tx:/home/tx:/bin/bash
例:打印第一行最初一个字段
#awk-F:NR==1{print$NF}p1
/bin/bash
例:打印最初一行最初一个字段
#awk-F:END{print$NF}p1
例:打印每行的倒数第二个字段,并在厥后打印你好
#awk-F:{print$(NF-1),"nihao"}p1
/rootnihao
/binnihao
/sbinnihao
例:打印行号
#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
例:打印以后体系情况变量的某个特定值
#awkBEGIN{printENVIRON["PATH"];}
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
例:用:支解,删除第2个字段
#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)小数成绩
对小数取保存位的时分,四舍五进
对小数取整,不举行四舍五进
#catawk.1
23.345611.23445.67
#awk{printf"%.2f %.2f %.2f
",$1,$2,$3}awk.1
23.3511.2345.67
四.awk的利用
(1)正则表达式
(){}不撑持
.*^$?+[]|<>()能够间接利用
例#awk/^$/{print"thisisanemptyline"}/etc/inittab
thisisanemptyline
thisisanemptyline
thisisanemptyline
thisisanemptyline
thisisanemptyline
thisisanemptyline
thisisanemptyline
thisisanemptyline
thisisanemptyline
例#awk-F:/^root/{print$1,$NF}/etc/passwd
root/bin/bash
例#awk-F:!/^root/{print$1,$NF}/etc/passwd|head-3
bin/sbin/nologin
daemon/sbin/nologin
adm/sbin/nologin
(2)干系运算符
><==!=>=<=
~(婚配)!~(不婚配)
例#cp/etc/passwdp1
#awk-F:$3==0{print$1}p1
Root
例#awk-F:$3!=0{print$1}p1|head-2
bin
Daemon
例#awk-F:$3<2{print$1}p1
root
bin
(3)逻辑运算符
&&||!
与或非
例#awk-F:$3>0&&$3<10{print$1,$3}p1|head-2
bin1
daemon2
例#awk-F:$3>10||$3<5{print$1,$3}p1|head-6
root0
bin1
daemon2
adm3
lp4
operator11
(4)算数运算符
+-*/%(取模(余数))^(幂运算)
例:输入名字,总成就,均匀成就
#catcj
tx908686
tx1897885
tx2798085
#awk{print$1,$2+$3+$4,($2+$3+$4)/3}cj
tx26287.3333
tx125284
tx224481.3333
#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能够从管道和尺度输出读取输出,然后传送给变量。
例:
#awkBEGIN{"date"|getlinea}{print}END{printa}cj
tx908686
tx1897885
tx2798085
ThuFeb712:39:25CST2013
五.awk里的流把持和轮回
(1)复杂的前提判别
语法:(表达式?值1:值2)假如表达式建立,输入值1;不然输入值2
#catnum
289
846
357
#awk{print($1>$2?$1:$2)}num
8
8
5
(2)if判别
语法:
{if(表达式
{
举措1;举措2;...
}
}
假如表达式建立,那末实行举措。
#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;...}
}
#catcj
tx908686
tx1897885
tx2798085
tx3807060
tx4758565
tx5786280
判别的尺度:
90-100A
80-89B
70-79C
60-69D
0-59E
#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;...更新变量的举措;}
例:
#awk-F:{i=1;while(i<=NF){print$i;i++}}p1|head-7
root
x
0
0
root
/root
/bin/bash
例.***一
#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
例.***二
#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跳出轮回
例
#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
例
#catnum
289
846
357
#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("守候被切割的字符串",数组名,"切割用的分开符")
#awkBEGIN{split("2012/08/23",da,"/");printda,da,da}
08232012
@2toupper()小写转年夜写
tolower()年夜写转小写
#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)
例:
#awk-F:{sub(/root/,"r00t");print}p1
r00t:x:0:0:root:/root:/bin/bash
例:
#awk-F:{gsub(/root/,"r00t");print}p1
r00t:x:0:0:r00t:/r00t:/bin/bash
operator:x:11:0:operator:/r00t:/sbin/nologin
例:
#awk-F[:/]{gsub(/root/,"r00t",$7);print}p1
rootx00rootr00tbinbash
operatorx110operatorr00tsbinnologin
@4.length()盘算字符串的长度
#awk-F:{printlength($1),$1}p1
4root
3bin
6daemon
3adm
@5.数学盘算
#awkBEGIN{printsin(30)}
-0.988032
#awkBEGIN{printcos(60)}
-0.952413
#awkBEGIN{printint(22/6)}
3
#awkBEGIN{printsqrt(3)}
1.73205
欢迎大家来到仓酷云论坛!
带来一篇Shell剧本之awk详解
随着IT从业人员越来越多,理论上会有更多的人使用Linux,可以肯定,Linux在以后这多时间不会消失。 直到学习Linux这门课以后,我才知道,原来我错了。? 对我们学习操作系统有很大的帮助,加深我们对OS的理解。? 感谢老师和同学们在学习上对我的帮助。 有疑问前,知识学习前,先用搜索。 在系统检测不到与Linux兼容的显卡,那么此次安装就可能不支持图形化界面安装,而只能用文本模式安装等等。 熟读写基础知识,学得会不如学得牢。 可以说自己收获很大,基本上完成了老师布置的任务,对于拔高的题目没有去做,因为我了解我的水平,没有时间和精力去做。?
页:
[1]