awk的使用方法(二)

awk的工作方式是: 通过给定的参数,去逐行读取文本(或通过管道传递的内容),通过模式判断,再执行对应的动作
awk如何处理每一行的内容: awk每读一行,会将这一行的内容定义为$0, 再通过空格将这一行切割成多个字符串, 按顺序分别定义为$1 $2 $3 $4......以此类推

这一篇讲动作

动作,在awk中用{}包含,常见的动作包含:定义、计算、循环与判断、输出等

定义:
例1:         

#这个动作定义了一个变量a等于NR,这里的NR是一个awk的内置变量,用于记录第几行,每读一行文件,a就会更新,文件读完了之后输出a的结果,也就是文件的行数
awk '{a=NR}; END {print a}' /etc/passwd


例2:         

#这里定义了一个数组,索引是NR,内容是$0,最后输出其中一行
awk '{line[NR] = $0}; END {print line[12]}' /etc/passwd


例3: 

#FS是一个awk的内置变量,用于指定分隔符,默认是空格,这里将其改为冒号
awk 'BEGIN {FS=":"}; {print $4}' /etc/passwd
        

计算:
例1.行数

#自己定义一个变量num,没有初始化,默认为0,每读一行加一
awk '{num = num+1}; END {print num}' /etc/passwd
        


例2.加减

#使用变量相加,最后输出时减一
awk -F ":" '{sum=sum+$3}; END {print sum-1}' /etc/passwd


例3.乘除

#初始化为1,如果第三个字段不为0就相除,最后乘以2
#注意,awk可以不用定义变量即可使用,但是用做计算时该变量为0
awk -F ":" 'BEGIN {s=1}; $3 != 0 {s = s/$3}; END {print s*2}' /etc/passwd

循环:
例1.for

#这里结合上面的例子,在文件读完之后,加入一个for循环,将数组里面的内容逐行输出
awk 'BEGIN {FS=":"}; {line[NR] = $0};
    END{ 
        for (i in line){
            printf("%s\n", line[i])
        }
    };
' /etc/passwd
#上面的顺序是乱的,因为awk用的是关联数组,如果要按顺序输出,可以根据函数length取数组line的长度,再进行循环;
awk 'BEGIN {FS=":"}; {line[NR] = $0};        
    END{ 
        for (i=1;i<=length(line);i++)
            printf("%s\n", line[i])
    };
' /etc/passwd


例2.while

#和for循环基本没差别
awk 'BEGIN {FS=":"}; {line[NR] = $0};
    END{
        while (i<=NR-5){
            printf("%s\n", line[i])
            i++
        }
    };
' /etc/passwd


例3.if
 

awk 'BEGIN {FS=":"}; {line[NR] = $0};
    END{
        if (length(line)>30){
            printf("%s\n", "该文件的总行数大于30")
        }
        else{
            printf("%s\n", "该文件的总行数小于30")
        }
    };
' /etc/passwd


 

### Linux 中 `awk` 命令的使用方法 #### 什么是 `awk` `awk` 是一种强大的文本处理工具,主要用于模式扫描和文本处理。它可以识别并处理文件中的每一行数据,并按照指定条件执行操作[^1]。 #### `awk` 的基本语法结构 `awk` 的基本格式可以表示为: ```bash awk [选项] '脚本' 输入文件 ``` 其中 `[选项]` 可选,而 `'脚本'` 部分通常是一个简单的程序逻辑,用于定义如何处理输入的数据[^2]。 #### 示例:简单计算 下面展示了一个简单的例子,说明如何通过 `awk` 执行一些基础运算: ```bash awk 'BEGIN { x = 10; print x + 1 }' ``` 此命令会在不读取任何外部文件的情况下打印出 `11`。这里需要注意的是,在单引号内部的内容会被直接解释为字符串形式传递给 `awk` 处理器,因此即使没有 `$` 符号也能正常工作[^3]。 #### 文件内容筛选与字段提取 假设有一个名为 `data.txt` 的文件,其内容如下: ``` John Doe,30,San Francisco Jane Smith,25,Los Angeles Bob Johnson,40,New York ``` 要获取每个人的年龄列(即第列),可运行以下命令: ```bash awk -F ',' '{print $2}' data.txt ``` 上述指令设置了逗号作为分隔符 (`-F ','`) 并输出每行记录中的第个字段[$2]。 #### 条件过滤 继续以上述 `data.txt` 数据为例,如果我们只想显示那些来自洛杉矶的人的信息,则可以用这样的语句实现: ```bash awk -F ',' '$3 == "Los Angeles" {print $0}' data.txt ``` 这里的 `$3 == "Los Angeles"` 表达式指定了仅当第三列为 `"Los Angeles"` 时才执行后面的 `{print $0}` 动作。 #### 结合多个动作 还可以在一个 `awk` 调用里完成多项任务。比如统计总人数以及平均年龄: ```bash awk -F ',' 'NR==1{sum=0}{sum += $2}END{print "Total:", NR, ", Average Age:", sum/NR}' data.txt ``` 这段代码先初始化求和变量 `sum` ,接着累加所有人的年龄到该变量上;最后在结束阶段(`END`)报告总数目及均值。 #### 内建变量简介 以下是几个常用的内置变量及其功能概述: - **NF**: 当前行拥有的域数(字段数量) - **NR**: 已经被读入的记录数目 (当前行为第几条) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值