awk的使用方法(一)

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

模板:

awk -options 'pattern { action };' file

例如: 

awk -F ":" '$1=="root" {print $0}' /etc/passwd

解释:
    options -> 参数(可以做一些定义)
    pattern -> 模式(常见的有判断、搜索、和两个特殊模式)
    action  -> 动作(常见的是print,或定义一个变量,或for,while,if等等)


常用解析
1、以“:”作为分隔符,第一列等于root的输出

awk -F ":" '$1=="root" {print $0}' /etc/passwd
#解读
-F ":"        #参数, awk默认为空格,这里根据实际需要选择分隔符为':'; 
$1=="root"    #模式, 类似于if,判断条件是否成立;
{print $0}    #动作,最基本的动作就是print输出内容

2、搜索每一行是否出现“root”

awk -F ":"  '/root/ {print $0}' /etc/passwd
#解读 
/root/    #搜索这一行是否存在'root'这个字符串

3、多个模式+动作

awk -F ":" '$1=="root" {print $1}; $1 == "gdm" {print $1};' /etc/passwd
#多个模式+动作用';'隔开, 不使用';'也行, 就是不太好看
$1=="root" {print $1};    #第一个模式+动作
$1=="gdm" {print $1};     #第二个模式+动作

4、一个动作内包含多个函数

#动作内有两个print函数, 中间用';'隔开,当条件为真,两个命令都执行, 写法与shell无异
awk -F ":" '$1=="root" {print $1; print "我就随便输出点东西吧"};' /etc/passwd

5、一个模式内包含多个条件

#该模式内有两个条件, 用&&关联, 写法与shell无异
awk -F ":"  '/root/ && $2=="x" {print $0}' /etc/passwd

6、无参数或无模式或无动作
 

awk '/root/ {print $1}' /etc/passwd    #不定义切割符
awk -F ":" '{print $1}' /etc/passwd    #不匹配任何参数, 将每一行的第一列全部输出
awk -F ":" '/root/' /etc/passwd        #不执行任何动作, 但是还是将匹配到的行输出

7、特殊模式(BEGIN和END是一种特殊的模式,用于文件读取之前和文件读取之后的操作)

#格式
awk  'BEGIN { action }; pattern { action1 }; END { action }' file
#示例
awk -F ":" 'BEGIN {print "开始"}; $1=="root" {print $0}; END {print "结束"};' /etc/passwd
#在文本操作之前进行初始化设置(我定义了变量s=1)
awk -F ":" 'BEGIN {s=0}; $1 == "tss" && $2 == "x" {print $0; s=s+1};END {print s}' /etc/passwd
#特殊说明一下,下面的命令也能运行:
awk -F  ":" 'END {print NS};BEGIN {print "开始"}; $1 == "root" {print $0};END {print "结束"};END {print NR};BEGIN {print "这TM也行!!!" }' /etc/passwd
awk -F  ":" 'END {print NS}BEGIN {print "开始"}$1 == "root" {for (i=1;i<=NF;i++){print $i}}END {print "结束"}END {print NR}BEGIN {print "这TM也行!!!" }' /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、付费专栏及课程。

余额充值