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&lt;=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&lt;=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
Last modification:February 1, 2020
如果觉得我的文章对你有用,请随意赞赏