awk命令详解

原文出处:https://www.cnblogs.com/My-IronMan/p/15721682.html

awk作用:处理文本

awk语法格式

awk [参数] [处理内容] [操作对象]

awk使用方法

1 print 打印
2 NF 统计总字段数
3 NR 统计行数
4 $ 取值
View Code

 $配合NF使用

  • NF内存储统计文件内每行的总字段,NF相当于变量值。
  • $存储NF内的值,$相当于变量名。

 

 awk参数

1 -F:指定文本分割符,默认以空格作为分割符
2 
3 实例:已'w'作为分割符
4 awk -F'w' '{print $NF}' 1.txt

awk的生命周期

1 grep,sed,awk都是读一行处理一行,直到处理完成
2 接受一行作为输入
3 把刚刚读人进来的文本进行分解
4 使用处理规则来处理文本
5 输入一行赋值给$0,直到处理完成
6 把处理完成之后的所有数据交给end {}来再次处理

awk中的预定义变量

1 $0:代表当前列

 

$n:代表第n列

案例一:以:为分割符,取第一列

awk -F: '{print $1}' /etc/passwd

 

案例二:以空格为分割符,取第1列,(awk默认分割符就是空格)

awk '{print $1}' /etc/passwd

NF:统计总字段数

案例一:以:为分割符,统计文件每行内的行数

 awk -F: '{print NF}' /etc/passwd

 

案例二: 以:为分割符,统计文件内每行总字段 并打印每行统计行数对应的值

awk -F: '{print $NF}' /etc/passwd

NR    : 用来记录行号
案例1:
    awk -F: '{print NR}' /etc/passwd
    
FS    : 指定文本内容分隔符(默认是空格)
案例1:
    awk 'BEGIN{FS=":"}{print $NF, $1}' /etc/passwd
    解析:
        BEGIN{FS=":"}    : 相当于指定以 : 为分隔符
            $NF            : 存储以 : 分隔符的最后一列
            $1            : 存储以 : 分隔符的第一列
            print        : 打印

OFS    : 指定打印分隔符(默认空格)
案例1:(输出的意思 分隔符会打印出来)
    awk -F: 'BEGIN{OFS=" >>> "}{print $NF, $1}' /etc/passwd
    FS    的优先级要高于 -F    
    解析:
        BEGIN{OFS=" >>> "} : 指定打印分隔符
            $NF              : 存储以 >>> 分隔符的最后一列
            $1              : 存储以 >>> 分隔符的第一列
            print          : 打印

awk运行处理规则的执行流程

1. BEGIN{}    : 最开始执行
2. //        : 正则
3. {}        : 循环体
4. END{}    : 最后执行

这里面最少有一个,最多有四个!

awk中的函数

print    : 打印
    printf    : 格式化打印
    %s        : 字符串
    %d        : 数字
    -        : 左对齐
    +        : 右对齐
    15        : 至少占用15字符
    

awk中函数(格式化打印)
案例1:
awk -F: 'BEGIN{OFS=" | "}{printf "|%+15s|%-15s|\n", $NF, $1}' /etc/passwd

解析:
|        : 以 | 为分隔符
|%+15s|     : 以 | 为分隔符 %s 配合 printf 使用 代替当前字符串 右对齐 占用15字符
|%-15s|     : 以 | 为分隔符 %s 配合 printf 使用 代替当前字符串 左对齐 占用15字符
\n         : 换行符
$NF         : 存储以 | 为分隔符的最后一列
$1         : 存储以 | 为分隔符的第一列

awk中的定位

1.正则表达式
案例1:(awk中匹配有root内容的行)
    awk -F: '/root/{print $0}' /etc/passwd
解析:
    /root/{print $0}    : awk中先执行正则 在执行循环 匹配文件内有root的每一行。
           $0            :代表所有
案例2:(awk中匹配root开头的行)
    awk -F '/^root/{print $0}' /etc/passwd

比较表达式(匹配文本之内的内容)

    >        : 小于
    <        : 大于
    >=        : 小于等于
    <=        : 大于等于
    ~        : 正则匹配(包含)
    !~        : 正则匹配(不包含)
    

案例1:
    要求打印属组ID大于属主ID的行
    awk -F: '$4 > $3{print $0}' /etc/passwd
解析:
    $4    : 代表属组所在列
    $3    : 代表属主所在列
    $0    : 所有行

案例2:
    打印结尾包含bash
    awk -F: '$NF ~ /bash/{print $0}' /etc/passwd
解析:
    $NF ~ /bash/    :尾部最后一列 包含 bash 的行
        ~           : 包含

a案例3:
    打印结尾不包含bash
    awk -F '$NF !~ /bash/{print $0}' /etc/passwd
解析:
    !~    : 不包含 (将打印其他内容)

条件表达式(文本之外的内容)

    ==        
    >
    <
    >=
    <=

要求打印第三行
案例1:
    awk -F: 'NR == 3{print $0} /etc/passwd'
解析:
    NR  : 行号
NR == 3  : 行号等于3


注意:
$1         : 是列
NR == 3  : 是行

逻辑表达式

    &&        : 逻辑与
    ||        : 逻辑或
    !       : 逻辑非


案例1:(与(两者条件必须都成立))
    awk -F: '$3 + $4 > 2000 && $3 * $4 > 2000{print $0}' /etc/passwd

案例2:(或(两者条件一个成立即可))
    awk -F: '$3 + $4 > 2000 || $3 * $4 > 2000{print $0}' /etc/passwd
  
案例3:(非(条件取反))
    awk -F: '!($3 + $4 > 2000){print $0}' /etc/passwd

算数表达式

    +    :加
    -    :减
    *    :乘
    /    :除
    %    :求余
    

1.要求匹配打印出属组 + 属主的ID 大于 2000 的
案例1:
    awk -F: '$3 + $4 > 2000{print $0}' /etc/passwd
    
2.要求属组 * 属主的ID 大于 2000
案例2:
    awk -F: '$3 * $4 > 2000{print $0}' /etc/passwd

3.要求打印偶数行
案例3:
    awk -F: 'NR % 2 == 0{print $0}' /etc/passwd
解析:
    NR  :全部行号 除以 2 == 零的 零等于余数
  
 偶数 : 2 4 6...
 
4.要求打印奇数行
案例4:
    awk -F: 'NR % 2 == 1{print $0}' /etc/passwd
    
    NR  :全部行号 除以 2 == 1的 零等于奇数

奇数: 1 3 5...

流程控制

简介:
    流程控制只存在循环之中

if:
    awk -F: '{if($3>$4){print "大于"}else{print "小于或等于"}}' /etc/passwd
解析:
    判断文件 第三列大于第四列的话打印(大于) 不大于 else

if 使用格式:
if(){}                   : 但分支
if(){}else{}            : 双分支
if(){}else if(){}else{}    : 多分支


for每一行打印10次
for 使用格式
    awk -F: '{for(i=10;i>0;i--){print $0}}' /etc/passwd
解析:
    i-- 相当于python中的 i-=1   : i=i-1
    减到条件不成立为止
    格式:
    fro(i="初始值":条件判断:游标){}
    
while每一行打印10次
while 使用格式
    awk -F: '{i=1; while(i<10){print $0, i++}}' /etc/passwd
解析:
    i++ 相当于python中的 i+=1
    加到条件不成立为止
    格式:
    while(条件判断){}

实战案例(if判断打印隔五一行线)

1.使用if判断
每隔5行,打印一行横线
awk -F: '{if(NR%5==0){print "----------"}print $0}' /etc/passwd
解析:
    1. NR    : 每一行的行号
    2. 行号 除以 5 ==0
    3. 打印一行
    以此类推 4%5=0.8

 

 
 
 
 
posted @ 2023-02-16 14:17  LaniLai  阅读(865)  评论(0)    收藏  举报