awk学习

awk支持所有的正则表达式元字符,并且还支持?,+这两个扩展元字符,而grep,sed不支持

awk工作模式

将文本一行一行读入模式空间,每一行称作一条记录records,每条记录按特定的分割符号分开,每个部分称作一个域fields,域用$调用

awk语法

awk option 'pattern{action}' 文件 文件      #option选项,pattern模式,action动作,由模式的真假决定动作是否执行

awk的模式
    BEGIN   表示开始之前
    END 表示结束之前

    $0  打印全部域(整行)
    $1  打印第一个域
    $2  打印第二个域
    $3  ......
    $后面还可以跟变量或表达式,注意awk引用内部变量不需要$符号,这里的$是打印域的意思
        awk -F: 'BEGIN{one=1;two=2} {print $one,$(one+two)}' /etc/passwd        #打印第一个域,和第三个域

awk选项及其意义
    写法  意义                  举例
    -F  指定输入分割符号,默认是空格和TAB, -F:
    -f  调用awk脚本             awk -f awk.sh /etc/passwd
    -v  指定自定义变量

awk的内键变量及其意义(内键变量都是大写的)
    FS  指定输入分割符,跟-F一样       awk 'BEGIN{FS=":"} {print $1}' /etc/passwd
    OFS 指定输出分割符,默认是空格   awk -F: 'BEGIN{OFS="\t"}{print $1,$3}' /etc/passwd
    NR  当前记录数(行号)
    FNR 浏览文件记录数(总共有多少行)
    NF  当前记录中的域数量
    $NF 打印记录的最后一个域
    RS  输入记录分隔符,默认是换行符  awk 'BEGIN{RS=":"}{print $1}' /etc/passwd
    ORS 输出记录分隔符,默认是换行符
    FILENAME    打印当前文件名

awk的关系运算符及其意义
    <
    >
    <=
    >=
    ==  等于
    !=  不等于
    ~   匹配正则表达式
    !~  不匹配正则表达式

awk布尔运算
    &&逻辑与,||逻辑或,!逻辑非

awk算数运算符及其意义
    +,-,*,/,%求余,^乘方,++x,x++

awk的格式化输出:printf
    运算符 意义
    %c  ASCII字符
    %d  整数型
    %e  浮点数,科学计数法
    %f  浮点数
    %o  八进制数
    %s  字符串
    %x  十六进制数

    修饰符 意义
    -   左对齐(不指定就是右对齐)
    width   域的宽度(步长)
    .prec   小数点后边的位数
    %-.3f   表示左对齐,小数点后面保留3个数字

    awk -F: '{printf "%-5.2s\n",$3}' /etc/passwd        
    awk -F: '{printf "%s\t%s\n",$3,$4}' /etc/passwd

awk条件语句和循环语句:条件表达式可以包含算数,关系,和布尔操作符
    if (条件表达式)
        {print $2}
    else
        {print $3}

    if (x ~ /root/){print $0}
    if (x ~ /root/){print $0}else{print $1}

    循环语句有三种while ,do while ,for
    while (条件表达式){print $2}

    do
    {print $2}
    while

    for (设置计数器初始值;测试计数器;计数器变化){动作}
    for (i in b){动作}

awk数组

    基本格式:array[index]=value

awk怎么调用shell中的变量

    a=15
    awk -v a=$a '{print a}' /etc/passwd

实例:

    awk -F: '{print $(NF-1)}' /etc/passwd       #打印每条记录的倒数第二个域
    awk -F: '{a=NF-1;print a}' /etc/passwd      #打印每条记录的倒数第二个域
    awk -F: '{print $1"="$2}' /etc/passwd       #打印第一个域和第二个域,中间用=分开
    awk -F: 'NR==3{print $0}' /etc/passwd       #打印第三行
    awk -F: 'NR>1&&NR<4{print $0}' /etc/passwd  #打印第二到三行
    awk -F: 'NR==3{print $0}NF>4{print $2}' /etc/passwd #打印第三行和大于第四行的第二个域
    awk '{print $0,$1+$2+$3,($2+$3)/2}' ./suxue #计算
    awk '{a+=$2}END{print a}' ./suxue       #将所有的第二个域相加,得到最后的和
    awk -F: '{if($3>800){print $0}}' /etc/passwd    #打印第三个域大于800的行  (if判断)
    awk -F: '{if($1=="root"){print $0}else{$1="root";print $0}}' /etc/passwd

    awk -F: '{for(i=1;i<=NF;i++){print $i}}' /etc/passwd    #让每一个域都占一行(for循环)
    awk '/^r/{print $0}' /etc/passwd        #匹配正则表达式,以r开头的行
微信打赏微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者

最后编辑于:2022/11/20作者: 辣条①号

现在在做什么? 接下来打算做什么? 你的目标什么? 期限还有多少? 进度如何? 不负遇见,不谈亏欠!

暂无评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

arrow grin ! ? cool roll eek evil razz mrgreen smile oops lol mad twisted wink idea cry shock neutral sad ???