学习笔记

Day64-shell编程_正则表达式_awk

2019-11-08  本文已影响0人  三德书生

1.Awk基础介绍

2.awk语法格式
第一种形式:awk 'BEGIN{} pattern {commands} END {}' file_name
第二种形式:standard output | awk BEGIN{} pattern {commands} END {}
第三种形式:awk [options] -f awk-script-file filenames

2.Awk工作原理

 awk -F: '{print $1,$3}' /etc/passwd
1.awk将文件中的每一行作为输入, 并将每一行赋给内部变量$0, 以换行符结束
2.awk开始进行字段分解,每个字段存储在已编号的变量中,从$1开始[默认空格分割]
3.awk默认字段分隔符是由内部FS变量来确定, 可以使用-F修订
4.awk行处理时使用了print函数打印分割后的字段
5.awk在打印后的字段加上空格,因为$1,$3 之间有一个逗号。逗号被映射至OFS内部变量中,称为输出字段分隔符, OFS默认为空格.
6.awk输出之后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕.

3.Awk内部变量

    $0      #将读入进来的一行数据存储至$0中,读入进来默认按行为分割由RS变量控制
    $1      #经过FS变量字段分割后,将一行内容拆分成几段,分别赋值给$1 $2 $3.....
    NF      #统计每一行由FS分割之后多少列,多少个字段
    NR      #给每一行载入进来的内容,都添加一个编号
    FS      #指定字段分隔符,默认空格为分割
    RS      #指定读入进来的内容分隔符,默认按照 \n  换行符
    OFS     #输出字段分割符,默认是空格为分割
    ORS     #输出行分割符,默认是换行
    print   #打印

4.Awk格式输出

​   printf
格式符 含义
%s      打印字符串
%d      打印十进制数
%f      打印一个浮点数
%x      打印十六进制数
%o      打印八进制数

修饰符 含义
- 左对齐
- 右对齐

5.Awk模式匹配

1.正则匹配
2.运算符   <  >      +-/*
3.与或非

5.1符号 含义
< 小于
> 大于
<= 小于等于
= 大于等于
== 等于
!= 不等于
~ 匹配正则表达式
!~ 不匹配正则表达式

1、以:为分隔符,匹配/etc/passwd文件中第3个字段小于50的所有行信息

[root@oldxu ~]# awk 'BEGIN{FS=":"}$3<50{print $0}' passwd

2、以:为分隔符,匹配/etc/passwd文件中第3个字段大于50的所有行信息

[root@oldxu ~]# awk 'BEGIN{FS=":"}$3>50{print $0}' passwd

3、以:为分隔符,匹配/etc/passwd文件中第7个字段为/bin/bash的所有行信息

[root@oldxu ~]# awk 'BEGIN{FS=":"}$7=="/bin/bash"{print $0}' passwd

4、以:为分隔符,匹配/etc/passwd文件中第7个字段不为/bin/bash的所有行信息

[root@oldxu ~]# awk 'BEGIN{FS=":"}$7!="/bin/bash"{print $0}' passwd

5、以:为分隔符,匹配/etc/passwd文件中第3个字段包含3个数字以上的所有行信息

[root@oldxu ~]# awk 'BEGIN{FS=":"}$3 ~ /[0-9]{3,}/{print $0}' passwd 

5.2布尔运算符匹配示例
符号 含义
|| 或
&& 与
! 非

1、以:为分隔符,匹配passwd文件中包含ftp或mail的所有行信息。

 awk 'BEGIN{FS=":"}$1=="ftp" || $1=="mail" {print $0}' passwd

2、以:为分隔符,匹配passwd文件中第3个字段小于50并且第4个字段大于50的所有行信息。

awk 'BEGIN{FS=":"}$3<50 && $4>50{print $0}' passwd

3.匹配没有/sbin/nologin 的行。

 awk 'BEGIN{FS=":"} $0 !~ /\/sbin\/nologin/{print $0}' passwd
awk 'BEGIN{FS=":"} $7 != "/sbin/nologin"' passwd 

5.3运算符 含义
awk的 + - * / % 支持小数
+加
-减
*乘
/ 除
% 余
1.计算下列每个同学的平均分数,并且只打印平均分数大于90的同学姓名和分数信息

[root@manager awk]# cat student.txt 
oldxu       80    90    96    98
oldqiang    93    98    92    91
oldguo      78    76    87    92
oldli       86    89    68    92
[root@web01 awk]# cat student.awk 
BEGIN{
    printf "%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n",
    "Name","Chinese","Math","English","Intern","Total","Avg"
}
{
    total=$2+$3+$4+$5
    avg=($2+$3+$4+$5)/4
    if(avg>90)
    {
    printf "%-10s%-10d%-10d%-10d%-10d%-10d%-10.2f\n",
    $1,$2,$3,$4,$5,total,avg
    }
}
[root@web01 awk]# awk -f student.awk student.txt 
Name      Chinese   Math      English   Intern    Total     Avg       
oldxu     80        90        96        98        364       91.00     
oldqiang  93        98        92        91        374       93.50 

6.Awk条件判断

6.1 if语句格式: { if(表达式){语句;语句;... } }

1.以:为分隔符,打印当前管理员用户名称

    awk 'BEGIN{FS=":"} { if($3==0) { print $1,"是管理员"} }' /etc/passwd

2.以:为分隔符,统计系统用户数量

awk 'BEGIN{FS=":"}  { if($3<1000) { i++ }} END { print i,"系统用户" }' /etc/passwd

3.以:为分隔符,统计普通用户数量

awk 'BEGIN{FS=":"} { if ($3>=1000) { i++ } } END { print i,"个普通用 户"} /etc/passwd

4.以:为分隔符,只打印/etc/passwd中第3个字段的数值在50-100范围内的行信息

awk 'BEGIN{FS=":"} $3>=50 && $3<100 {print $0}' /etc/passwd

6.2 if...else 语句格式: {if(表达式){语句;语句;... }else{语句;语句;...}}
统计当前的超级管理员有几个 统计当前的普通用户有多少 统计当前的系统用户有多少个

[root@oldxu ~]# awk 'BEGIN {FS=":"} {if($3==0){print $1} else {print $7}}' /etc/passwd
[root@oldxu ~]# awk 'BEGIN {FS=":"} {if($3==0) {count++} else{i++} }' /etc/passwd
[root@oldxu ~]# awk 'BEGIN {FS=":"} {if($3==0){count++} else{i++}} END{print " 管理员个数: "count ; print " 系统用户数: "i}' /etc/passwd

**6.3 if...else if...else 语句格式: { if(表达式 1){语句;语句;... }else if(表达式 2){语句;语句;. .. }else{语句;语句;... }}**

1.使用awk if打印出当前/etc/passwd文件管理员有多少个,系统用户有多少个,普通用户有多少个

[root@manager awk]# cat user_total.awk 
BEGIN{
    FS=":";OFS="\n"
}

{ 
    if ($3==0) 
         { i++ } 
    else if ($3>=1 && $3<=999)
         { j++ }  
    else
         { k++ }  
} 
END { 
    print i "个超级管理员", 
    j "个系统用户" ,
     k "个普通用户"
}

1.打印/etc/passwd文件中UID小于50的、或者UID小雨50大于100、或者UID大于100的用户名以及UID。

[root@web01 awk]# cat passwd.awk 
BEGIN {
    FS=":";OFS="\n"
    printf "%-15s%-15s%-15s\n",
    "范围","USER","UID"
}

{
    if ($3<50)
    {
        printf "%-15s%-15s%-15s\n",
        "UID<50",$3,$1
    }
    if ($3>50 && $3<150)
    {
        printf "%-15s%-15s%-15s\n",
        "50<UID<150",$3,$1
    }
    if ($3>150)
    {
        printf "%-15s%-15s%-15s\n",
        "UID>150",$3,$1
    }
}

2.统计Nginx的状态,请分别打出200类 300类 400类 500类状态 出现了多少次

[root@web01 awk]# cat nginx.awk 
BEGIN {
        printf "%-15s%-15s%-15s%-15s\n",
        "200类","300类","400类","500类"
}
{
        if ($9 ~ "[2][0-9][0-9]") {
        a++
        }
        else if ($9 ~ "[3][0-9][0-9]") {
        b++
        }
        else if ($9 ~ "[4][0-9][0-9]") {
        c++
        }
        else if ($9 ~ "[5][0-9][0-9]") {
        d++
        }
}
END {
        printf "%-16d%-16d%-16d%-16d\n",
        a,b,c,d
}
上一篇 下一篇

猜你喜欢

热点阅读