Shell流编辑器awk

1 awk简介

awk 是一种强大的文本处理工具和编程语言,广泛用于处理和分析文本文件,尤其是结构化文本(如 CSV 文件和日志文件)。awk 提供了丰富的功能,可以对文本进行过滤、格式化和数据提取。

2 awk语法格式

awk [options] 'pattern { action }' file

· options:awk 的选项,用于设置输入输出格式、定义变量等。
· pattern:模式,用于匹配输入文本中的特定行。如果省略模式,awk 将应用动作(action)到所有行。
· action:在匹配模式的行上执行的命令。用 {} 包围,可以包含多条命令。
· file:要处理的输入文件。awk 也可以处理来自管道的输入。

3 awk工作原理

  • 启动与初始化: awk 程序启动时,首先会执行 BEGIN 块中的语句(如果存在)。这通常用于初始化操作,如设置字段分隔符(FS)等。
    示例: awk ‘BEGIN { FS=“,”; OFS=“,” } { print $1, $2 }’ filename

  • 逐行读取输入: awk 从输入文件或标准输入中逐行读取数据。 每次读取一行,将其存储在模式空间(pattern space)中,同时会自动将行分割成字段(默认以空白字符为分隔符)。

  • 模式匹配: awk 对每一行应用给定的模式(pattern),如果模式匹配成功,则执行相应的动作(action)。 模式可以是正则表达式、表达式、特定的条件(如字段值的比较)等。
    示例: awk ‘/pattern/ { print $0 }’ filename

  • 执行动作: 如果模式匹配成功,awk 执行大括号 {} 内的动作。 动作可以是打印、赋值、算术运算、逻辑判断等。
    示例: awk ‘{ sum += $1 } END { print sum }’ filename

  • 结束与清理
    当所有行都处理完后,awk 执行 END 块中的语句(如果存在)。这通常用于输出总结结果或进行清理操作。
    示例: awk ‘END {print “Processing completed.” }’ filename

4 awk选项参数说明

4.1 -F fs 或 --field-separator fs

用于指定 awk 的输入字段分隔符(Field Separator)。默认情况下,awk 使用空白字符(空格或制表符)作为字段分隔符。但是,如果数据使用其他字符(如逗号、冒号、分号等),则可以使用 -F 选项来指定这些分隔符。

示例1 使用逗号作为分隔符
假设有一个文件 data.txt,内容如下:

Alice,30,New York
Bob,25,Los Angeles
Charlie,35,Chicago

打印每行的第一个字段和第三个字段。

awk -F ',' '{ print $1, $3 }' data.txt

输出:

Alice New York
Bob Los Angeles
Charlie Chicago

示例 2:使用冒号作为分隔符
文件 passwd.txt,内容如下:

root:x:0:0:root:/root:/bin/bashuser:x:1000:1000:User Name:/home/user:/bin/bash

打印用户名和主目录

awk -F ':' '{ print $1, $6 }' passwd.txt

输出:

root /root
user /home/user

示例 3:使用制表符作为分隔符
文件 data.tsv,内容如下:

Alice	30	New York
Bob	25	Los Angeles
Charlie	35	Chicago

打印每行的第一个字段和第三个字段

awk -F '\t' '{ print $1, $3 }' data.tsv

输出:

Alice New York
Bob Los Angeles
Charlie Chicago

示例4:设置内部字段分隔符
在 awk 脚本中,可以通过设置内置变量 FS 来指定字段分隔符,而不是命令行选项 -F。

BEGIN {
   
   
    FS = ","
}
{
   
   
    print $1, $3
}

将以上脚本保存为 script.awk,然后运行:

awk -f script.awk data.txt

输出与使用 -F ‘,’ 选项时相同。

4.2 -v var=value

说明:定义一个 awk 变量 var 并赋予初始值 value。

示例1:使用外部传入的阈值
假设有一个文件 data.txt,内容如下:

Alice 30
Bob 25
Charlie 35

打印年龄大于一个指定阈值的人的名字。这个阈值将通过命令行参数传递给 awk。

awk -v threshold=30 '$2 > threshold { print $1 }' data.txt

输出:

Charlie

在这个示例中,使用 -v threshold=30 定义了一个名为 threshold 的变量,并将其值设为 30。在 awk 脚本中,使用这个变量来过滤和打印年龄大于 30 的人的名字。

示例 2:结合多个外部变量
假设我们有一个更复杂的文件 data.txt,内容如下:

Alice 30 Sales
Bob 25 Marketing
Charlie 35 Engineering
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值