awk动作表达式中的算术符
^ + - * / ++变量 变量++
在BEGIN定义变量并且输出
[root@docker-host vagrant]# awk 'BEGIN{var=20;var1="hellow";print var,var1}'
20 hellow
[root@docker-host vagrant]# awk 'BEGIN{num1=20;num2=30;print num1-num2}'
-10
[root@docker-host vagrant]# awk 'BEGIN{num1=20;num2=30;print num1+num2}'
50
[root@docker-host vagrant]# awk 'BEGIN{num1=20;num2=30;print num1*num2}'
600
[root@docker-host vagrant]# awk 'BEGIN{num1=20;num2=30;print num1/num2}'
0.666667
[root@docker-host vagrant]# awk 'BEGIN{num1=20;num2=30;printf "%0.2f\n",num1/num2}'
0.67
[root@docker-host vagrant]#
^或**的指数运算
[root@docker-host vagrant]# awk 'BEGIN{num1=2;num2=3;printf "%0.2f\n",num1**num2}'
8.00
[root@docker-host vagrant]# awk 'BEGIN{num1=2;num2=3;printf "%0.2f\n",num1^num2}'
8.00
[root@docker-host vagrant]#
++或–
++
[root@docker-host vagrant]# awk 'BEGIN{x=20;y=x++;print x,y}'
21 20
[root@docker-host vagrant]# awk 'BEGIN{x=20;y=++x;print x,y}'
21 21
—
[root@docker-host vagrant]# awk 'BEGIN{x=20;y=x--;print x,y}'
19 20
[root@docker-host vagrant]# awk 'BEGIN{x=20;y=--x;print x,y}'
19 19
举几个例子
用awk计算/etc/services中的空白行
awk '/^$/{sum++}END{print sum}' /etc/services
[root@docker-host vagrant]# awk '/^$/{sum++}END{print sum}' /etc/services
17
计算学生课程分数平均值,学生课程文件内容如下
vim list
Allen 80 90 96 98
Mike 93 98 92 91
Zhang 78 76 87 92
Jerry 86 89 68 92
Han 85 95 75 90
Li 78 88 98 100
使用命令、并且格式左对齐保留5位、先减后厨
cat list | awk '{total=$2+$3+$4+$5;avg=total/(NF-1);printf "%-8s%-5d%-5d%-5d%-8d%0.2f\n",$1,$2,$3,$4,$5,avg}'
图
给输出结果上面加上标题
cat list | awk 'BEGIN{printf "%-5s%-3s%-3s%-3s%-7s%s\n","姓名","语文","数学","英语","物理","平均分"}{total=$2+$3+$4+$5;avg=total/(NF-1);printf "%-8s%-5d%-5d%-5d%-8d%0.2f\n",$1,$2,$3,$4,$5,avg}'
结果
图
awk条件语句
if条件语句
if (条件表达事)
动作1
else if
动作2
else
动作3
举例说明:
1、以:分隔符,只打印/etc/passwd中第3个字段的数值在50-100范围内的行信息
[vagrant@docker-host sh]$ awk 'BEGIN{FS=":"}{if($3>50 && $3<100) print $0}' /etc/passwd
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
nslcd:x:65:55:LDAP Client User:/:/sbin/nologin
[vagrant@docker-host sh]$ awk 'BEGIN{FS=":"}{if($3>50 ){ printf "%-20s%-20s%-5d\n","大于50的UD",$1,$3}}' /etc/passwd
大于50的UD nobody 99
大于50的UD systemd-network 192
大于50的UD dbus 81
大于50的UD polkitd 999
注意:如果一个if不用加{}
图
注意:如果一个if不用加{}
awk 'BEGIN{FS=":"}{if($3>50 && $3<100){ print $0}}' /etc/passwd
等价于
awk 'BEGIN{FS=":"}{if($3>50 && $3<100) print $0}' /etc/passwd
if else if else 编写脚本执行
vim awk.script
BEGIN{
FS=":"
}
{
if($3<=50){
printf "%-20s%-20s%-5d\n","小于50的UD",$1,$3
}else if($3>50 && $3<=100){
printf "%-20s%-20s%-5d\n","大于50小于101",$1,$3
}else{
printf "%-20s%-20s%-5d\n","大于100",$1,$3
}
}
awk -f awk.script /etc/passwd
[vagrant@docker-host sh]$ awk -f awk.script /etc/passwd
小于50的UD root 0
小于50的UD bin 1
小于50的UD daemon 2
小于50的UD adm 3
小于50的UD lp 4
小于50的UD sync 5
小于50的UD shutdown 6
小于50的UD halt 7
小于50的UD mail 8
小于50的UD operator 11
小于50的UD games 12
小于50的UD ftp 14
大于50小于101 nobody 99
大于100 systemd-network 192
awk循环语句
计算下列每个同学的平均分数大于90的、用循环做
例子代码
vim list.txt
Allen 85 90 96 98
Mike 93 98 92 80
Zhang 78 76 87 92
Jerry 86 89 68 92
Han 85 95 75 70
Li 78 88 98 100
编写awk文件vim student.awk
BEGIN{
printf "%-5s%-3s%-3s%-3s%-7s%s\n","姓名","语文","数学","英语","物理","平均分"
}
{
count=2;sum=0;
while(count<(NF-1)){
sum+=$(count)+$(count+1);
count++;
}
if(sum/(NF-1)>90){
printf "%-8s%-5d%-5d%-5d%-8d%0.2f\n",$1,$2,$3,$4,$5,sum/(NF-1)
}
}
因为$1是姓名、所以count=2 ; $(count)等价于$2
[vagrant@docker-host sh]$ awk -f student.awk list.txt
姓名 语文 数学 英语 物理 平均分
Allen 85 90 96 98 90.25
Mike 93 98 92 80 95.25
计算总分、添加END语句、修改student.awk
BEGIN{
printf "%-5s%-3s%-3s%-3s%-7s%s\n","姓名","语文","数学","英语","物理","平均分"
}
{
count=2;sum=0;
while(count<(NF-1)){
sum+=$(count)+$(count+1);
count++;
}
if(sum/(NF-1)>90){
printf "%-8s%-5d%-5d%-5d%-8d%0.2f\n",$1,$2,$3,$4,$5,sum/(NF-1)
score_2+=$2;
score_3+=$3;
score_4+=$4;
score_5+=$5;
score_6+=sum/(NF-1);
}
}
END{
printf "%-8s%-5d%-5d%-5d%-8d%0.2f\n","",score_2,score_3,score_4,score_5,score_6
}
[vagrant@docker-host sh]$ awk -f student.awk list.txt
姓名 语文 数学 英语 物理 平均分
Allen 85 90 96 98 90.25
Mike 93 98 92 80 95.25
178 188 188 178 185.50
图
do while语句
do while
do
动作
while(条件表达式)
vim awk.script
BEGIN{
do
{
sum+=i;
i++
}while(i<=10)
print sum;
}
[vagrant@docker-host sh]$ awk -f awk.script
55
for 语句
for(初始化计数器;测试计数器;计数器变更)
动作
求1…..100的累加~
vim awk.script
BEGIN{
sum=0;
for(i=0;i<=101;i++){
sum+=i;
}
print sum;
}
[vagrant@docker-host sh]$ awk -f awk.script
5151
while循环
列子、求1…100的累加!
第一种写法:
awk 'BEGIN{i=0;sum=0;while(i<=100){sum+=i; i++;}print sum;}'
第二种写法:
vim awk.script
BEGIN{
i=0;sum=0;
while(i<=100){
sum+=i;
i++;
}
print sum;
}
[vagrant@docker-host sh]$ awk -f awk.script
5050
awk字符串函数对照表
length(str)
计算字符串长度 》 整数长度值
index(str1,str2) 在str1中查找str2的位置
在str1中查找str2的位置 》 返回值为位置索引,从1技术
tolower(str)
转换为小写 》 转换后的大写字符串
toupper(str)
转换为大写 》 转换后的大写字符串
substr(str,m,n) 从str的m个字符开始,截取n位
从str的m个字符串开始,截取n位 》截取后的子串
split(str,arr,fs)
按fs切割字符串,结果保存arr 》 切割后的子串的个数
match(str,RE)
在str中按照RE查找,返回位置 》 返回索引位置
sub(RE,RepStr,str)
在str中搜索符合RE的字符串,将其替换为RepStr;只替换第一个
》 返回替换的个数
gsub(RE,RepStr,str)
在str中搜索符合RE的字串,将其替换为RepStr;替换所有
》替换的个数
1、以:分隔符,返回/etc/passwd中每行中每个字段的长度
vim awk.script
BEGIN{
FS=":"
}
{
for(i=1;i<=NF;i++){
$(i)=length($(i));
}
printf "%d:%d:%d:%d:%d:%d:%d\n",$1,$2,$3,$4,$5,$6,$7;
}
[vagrant@docker-host sh]$ awk -f awk.script /etc/passwd
4:1:1:1:4:5:9
3:1:1:1:3:4:13
6:1:1:1:6:5:13
另一种写法
vim awk.script
BEGIN{
FS=":"
}
{
i=1
while(i<=NF){
if(i==NF){
printf "%d",length($i);
}else{
printf "%d:",length($i);
}
i++
}
print "";
}
[vagrant@docker-host sh]$ awk -f awk.script /etc/passwd
4:1:1:1:4:5:9
3:1:1:1:3:4:13
6:1:1:1:6:5:13
2、搜索字符串”I have a dream”中出现”ea”字串的位置
(1) 利用index()函数。
wk 'BEGIN{str="I have dream";location=index(str,"ea"); print location}'
[vagrant@docker-host sh]$ awk 'BEGIN{str="I a have dream";location=index(str,"ea"); print location}'
12
(2)利用match()函数、可以使用正则
这里的写法等价于index
awk 'BEGIN{str="I a have dream";location=match(str,"ea"); print location}'
awk 'BEGIN{str="I a have m dream";location=match(str,/m$/); print location}'
3、将字符串”Hadoop is a bigdata framework” 全部转换为小写
awk 'BEGIN{str="Hadoop is a bigdata Framework";print tolower(str); }'
4、将字符串”Hadoop is a bigdata framework” 全部转换为大写
awk 'BEGIN{str="Hadoop is a bigdata Framework";print toupper(str); }'
[vagrant@docker-host sh]$ awk 'BEGIN{str="Hadoop is a bigdata Framework";print toupper(str); }'
HADOOP IS A BIGDATA FRAMEWORK
5、将字符串”Hadoop Kafka Spark Storm HDFS Zookper”,按照空格分隔,把切割的内容存入数组arr里面
awk 'BEGIN{str="Hadoop Kafka Spark Storm HDFS Zookper";split(str,arr,FS);print arr[1]}'
用for in循环打印
`awk 'BEGIN{str="Hadoop Kafka Spark Storm HDFS Zookper";split(str,arr,FS);for(a in arr){ print arr[a]}}'
`
图
6、搜索字符串”Tranction 2345 start:select * from master”第一个数字出现的位置
awk 'BEGIN{str="Tranction 2345 start:select * from master"; print match(str,/[0-9]/);}'
[vagrant@docker-host sh]$ awk 'BEGIN{str="Tranction 2345 start:select * from master"; print match(str,/[0-9]/);}'
11
``
### 7、截取字符串”Tranction start”的子串,截取条件从第4个字符开始,截取5位 ###
`awk 'BEGIN{str="Tranction start";print substr(str,4,5)}'`
[vagrant@docker-host sh]$ awk 'BEGIN{str="Tranction start";print substr(str,4,5)}'
nctio
### 8、替换字符串”Tranction 243 start,Event ID:9002″中第一个匹配到的数字串为$符号 ###
awk 'BEGIN{str="Tranction 243 start,Event ID:9002";print sub(/[0-9]+/,"$",str);print str;}'
print sub 是返回替换的个数
[vagrant@docker-host sh]$ awk 'BEGIN{str="Tranction 243 start,Event ID:9002";print sub(/[0-9]+/,"$",str);print str;}'
1
Tranction $ start,Event ID:9002
### 9、替换字符串”Tranction 243 start,Event ID:9002″中全部匹配到的数字串为$符号 ###
[vagrant@docker-host sh]$ awk 'BEGIN{str="Tranction 243 start,Event ID:9002";print gsub(/[0-9]+/,"$",str);print str;}'
2
Tranction $ start,Event ID:$
[1]: https://echo.solo90.com/usr/uploads/2020/02/2584426730.png
[2]: https://echo.solo90.com/usr/uploads/2020/02/3105924283.png
[3]: https://echo.solo90.com/usr/uploads/2020/02/2997187481.png
[4]: https://echo.solo90.com/usr/uploads/2020/02/1819878276.png