linux文本命令:文本处理工具awk详解

目录

一、概述

二、基本语法

1、awk 命令的基本语法

2、常用选项

3、获取帮助

三、工作原理

四、 功能特点

五、分割字段

六、 示例

1. 打印所有行

2. 计算总和

3. 过滤特定模式

4. 使用多个模式

5. 复杂的脚本

6. 自定义分隔符

7. 打印指定列

8. 使用 BEGIN 和 END 块

9. 内置变量

10. 使用外部变量

11. 复杂的条件表达式

七、进阶用法

1、记录匹配

2、数组

3、函数


一、概述

    awk 是 Linux 和 Unix 系统上一个非常强大的文本处理工具,它能够对文本和数据进行复杂的处理和分析。awk 的名称来源于其三位创始人的名字首字母:Alfred Aho、Peter Weinberger 和 Brian Kernighan。最初为 Unix 系统设计,后来被移植到包括 Linux 在内的多种操作系统中。它非常适合用于格式化输出、数据提取和简单的报告生成任务。

        awk 设计之初是为了在文本文件中查找和替换文本,但它现在已经发展成为一个完整的编程语言,能够进行模式匹配和复杂的文本处理。       

二、基本语法

1、awk 命令的基本语法

        Awk [options] 'pattern {action}' [filename]

        - pattern: 用于匹配输入行中的模式。可以是正则表达式、条件表达式或布尔表达式。

        - {action}: 当模式匹配成功时,需要执行的命令或语句,可以是内置的 awk 命令,也可以是自定义的代码块。

        - [filename]: 指定要处理的文件名。如果省略,则默认从标准输入读取。

2、常用选项

        如下为常用选项:

  • -F fs 或 --field-separator=fs: 设置字段分隔符。
  • -v var=val 或 --assign=var=val: 定义变量及其初始值。
  • -f script-file 或 --file=script-file: 从文件中读取 awk 脚本。
  • -i inplace 或 --inplace: 直接在原文件上修改。
  • -n 或 --non-decimal-data: 允许非十进制数被识别。
  • -W interactive 或 --interactive: 以交互模式运行。

3、获取帮助

       在命令行中输入指令:

                awk -h

       出现如下图所示的帮助信息:

三、工作原理

        awk 按行处理文本文件,默认使用空格作为字段分隔符,将每一行分割成多个字段,并使用 $1, $2, … $n 来引用这些字段。其中 $0 代表整行文本。

四、 功能特点

        awk具有很多功能,主要有如下特点:

        1. 模式匹配: awk 可以根据指定的模式来选择处理哪些行。

        2. 字段分割: 输入行可以按照分隔符自动分割成多个字段。

        3. 变量: awk 支持变量的定义和使用。

        4. 流程控制: 包括条件语句(如 if, else)和循环语句(如 for, while)。

        5. 数学函数和字符串函数: 提供了丰富的内置函数支持数学运算和字符串操作。

        6. 用户自定义函数: 用户可以定义自己的函数以扩展 awk 的功能。

五、分割字段

        awk 默认使用空格作为字段分隔符,但可以通过 -F 或 --field-separator 选项指定其他字符:

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

        这会打印 /etc/passwd 文件中每个条目的第一个字段(用户名),其中字段是以冒号 : 分隔的。如下所示:

[root@ecs-52a1 /]# awk -F: '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
postfix
sshd
chrony
tcpdump
[root@ecs-52a1 /]# 

六、 示例

1. 打印所有行

   awk '{print}' file.txt

  

2. 计算总和

   awk '{sum += $1} END {print sum}' numbers.txt  

3. 过滤特定模式

   awk '/pattern/ {print}' file.txt

  

4. 使用多个模式

   awk '/pattern1/ || /pattern2/ {print}' file.txt  

5. 复杂的脚本

        如下为脚本代码:

   awk '
   BEGIN {print "Start of the file"}
   /pattern1/ {print "Found pattern1"}
   /pattern2/ {print "Found pattern2"}
   END {print "End of the file"}
   ' file.txt

  

6. 自定义分隔符

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

  

7. 打印指定列

        假设文件 data.txt 内容如下:

        Name Age City 

        John 30 New York 

        Doe 25 Los Angeles

要打印每行的第二列(即年龄),使用如下命令:

        awk '{print $2}' data.txt

        输出:

                Age 

                30 

                25

        注意,$0 表示整行,$1 表示第一列,以此类推。

        实际操作如下图:


8. 使用 BEGIN 和 END 块

        BEGIN 块在读取任何输入行之前执行,END 块在读取完所有输入行之后执行。

        awk 'BEGIN {print "Start"} {print} END {print "End"}' filename

9. 内置变量

        awk 有许多内置变量,如 NR(当前记录号,即行号)、NF(当前记录的字段数,即每行的列数)等。

        打印每行的行号和每行的字段数:

         awk '{print NR, $0, NF}' filename

10. 使用外部变量

        可以在 awk 命令中通过 -v 选项设置外部变量。

        awk -v var="Hello" 'BEGIN {print var}'

11. 复杂的条件表达式

        awk 支持复杂的条件表达式,包括正则表达式匹配。

                awk '/John/ {print $0}' filename

        这会打印所有包含 "John" 的行。

七、进阶用法

1、记录匹配

        使用 NR 记录总数,FNR 当前文件的记录数。

        可以使用如下命令记录文件的行数

                awk 'END{print NR}' file.txt

  

2、数组

        可以使用数组存储和处理数据,可以进行复杂的数据处理。

        awk '{name[$1] = $2} END {for (i in name) print i, name[i]}' filename

        这个命令会创建一个以名字为键,年龄为值的数组,并在结束时遍历并打印它。

3、函数

          可以定义和调用用户自定义函数。


文章正下方可以看到我的联系方式:鼠标“点击” 下面的 “威迪斯特-就是video system 微信名片”字样,就会出现我的二维码,欢迎沟通探讨。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值