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

news2024/9/22 11:34:08

目录

一、概述

二、基本语法

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 微信名片”字样,就会出现我的二维码,欢迎沟通探讨。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1982533.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序教程011-1:京西购物商城实战

文章目录 1、起步1.1 uni-app简介1.2 开发工具1.2.1 下载HBuilderX1.2.2 安装HBuilderX1.2.3 安装scss/sass编译1.2.4 快捷键方案切换1.3 创建uni-app项目1.4 目录结构1.5 把项目运行到微信开发者工具1.6 使用Git管理项目1.6.1 本地管理1.6.2 把项目托管到码云1、起步 1.1 uni…

【Unity】3D功能开发入门系列(五)

Unity3D功能开发入门系列(五) 一、预制体(一)预制体(二)预制体的创建(三)预制体实例(四)预制体的编辑 二、动态创建实例(一)动态创建实…

2024/8/4 汇川变频器低压产品分类选型

VF就是通过电压、频率控制 矢量就是通过开环(svc)和闭环(fvc) MD310、MD200 开环,不支持闭环,无法接编码器 290 、200s、280、都是VF控制

有哪些供应链管理方法?详解四种常用的供应链管理方法!

在当今复杂多变的商业环境中,供应链管理已成为企业获取竞争优势的关键。有效的供应链策略不仅能提升企业的响应速度和市场适应性,还能显著降低成本、提高效率。本文将深入探讨几种主流的供应链管理方法,包括快速反应、有效客户反应、基于活动…

LeetCode 0572.另一棵树的子树:深搜+广搜(n^2做法就能过,也有复杂度耕地的算法)

【LetMeFly】572.另一棵树的子树:深搜广搜(n^2做法就能过,也有复杂度耕地的算法) 力扣题目链接:https://leetcode.cn/problems/subtree-of-another-tree/ 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 s…

DEBUG:sw模板不对

问题 sw自带模板不合适 解决 工具 选项 文件位置 自己新建一个文件夹 放入模板 (三维 二维各一个 一般就是统一标准 可以自己新建个模板)

深度学习笔记(神经网络+VGG+ResNet)

深度学习 主要参考博客常用英语单词 概念应用神经网络基础神经网络基本结构 超参数超参数是什么常用超参数超参数搜索过程常用超参数调优办法(通过问题复杂度和计算资源选择) 激活函数介绍为什么要使用激活函数推荐博客 sigmoid激活函数(使用…

【教程-时间序列预测】PyTorch 时间序列预测入门

文章目录 from博客: https://zhajiman.github.io/post/pytorch_time_series_tutorial/#%E9%AB%98%E7%BA%A7%E6%96%B9%E6%B3%95%E8%87%AA%E5%9B%9E%E5%BD%92%E6%A8%A1%E5%9E%8B 数据集产生 窗口 也是难点!

工作中,如何有效解决“冲突”?不回避,不退让才是最佳方式

职场里每个人都在争取自己的利益,由于立场的不同,“冲突”不可避免。区别在于有些隐藏在暗处,有些摆在了台面上。 隐藏在“暗处”的冲突,表面上一团和气,实则在暗自较劲,甚至会有下三滥的手段;…

常见API(二)

API 应用程序编程接口,提高编程效率。本次学习了Object类,Objects工具类,包装类,StringBuilder,StringBuffer,和StringJoiner。 目录 1.Object 常见方法: 2.Objects 常见方法: 3…

AcWing开放地址法和拉链法

开放地址法&#xff0c;把h数组全部设置为3f&#xff0c;然后设定null为0x3f3f3f3f&#xff0c;find函数设定返回值t&#xff0c;如果h[t]null,那么x在h中不存在&#xff0c;否则为存在 #include<iostream> #include<cstring> #include<string> #define LEN…

在Vue3中如何为路由Query参数标注类型

前言 最近发布了一款支持IOC容器的Vue3框架&#xff1a;Zova。与以往的OOP或者Class方案不同&#xff0c;Zova在界面交互层面仍然采用Setup语法&#xff0c;仅仅在业务层面引入IOC容器。IOC容器犹如一把钥匙&#xff0c;为我们打开了业务工程化的大门&#xff0c;允许我们探索…

Linux网络编程2

TCP编程 顺序图 socket() 函数 socket()函数用于创建一个新的套接字。它是进行网络编程的第一步&#xff0c;因为所有的网络通信都需要通过套接字来进行。 原型&#xff1a; #include <sys/socket.h> int socket(int domain, int type, int protocol); domain&…

使用Go语言绘制饼图的教程

使用Go语言绘制饼图的教程 在本教程中&#xff0c;我们将学习如何使用Go语言及gg包绘制饼图&#xff0c;并将其保存为PNG格式的图片。饼图是一种常用的数据可视化图表&#xff0c;用于展示数据的比例关系和组成部分。 安装gg包 首先&#xff0c;确保你已经安装了gg包。如果还…

前端的学习-CSS(七)

一&#xff1a;定位(position) 1&#xff1a;为什么使用定位。 有一些固定的盒子&#xff0c;并且压在其他盒子上面&#xff0c;一些网页&#xff0c;会有固定的窗口&#xff0c;这些是标准流和浮动无法解决的&#xff0c;比如下面的例子。旁边的红色边框的效果是不会随着页面的…

汇昌联信数字做拼多多运营怎么入行?

拼多多作为中国领先的电商平台之一&#xff0c;近年来在数字运营领域展现出了强大的生命力和创新能力。汇昌联信数字作为一个潜在的新入行者&#xff0c;如何进入拼多多的运营领域&#xff0c;成为业界关注的焦点。本文旨在探讨汇昌联信数字如何通过有效的策略和方法&#xff0…

hal库回调函数机制

1. 第一行就是标准库函数的 在 nvic那个中断向量表里面的函数 以前写的都是 在中断向量表里面把这个中断处理函数重写 2. 第二行 第三行 的 hal库就是 通过中断向量表里面的这个函数 &#xff0c;再一次调用hal自己的中断回调函数&#xff0c;就是相当于多封装了两层 这个图更…

局部整体(二)利用python绘制维恩图

局部整体&#xff08;二&#xff09;利用python绘制维恩图 维恩图&#xff08; Venn Diagram&#xff09;简介 维恩图显示集与集之间所有可能存在的逻辑关系&#xff0c;每个集通常以一个圆圈表示&#xff0c;每个集都是一组具有共同之处的物件或数据。当多个圆圈&#xff08;…

【Material-UI】File Upload Button 组件详解

文章目录 一、基础实现1. component"label"2. 隐藏的输入元素 二、样式和交互增强1. 自定义按钮样式2. 交互提示 三、支持多文件上传四、无障碍性&#xff08;Accessibility&#xff09;1. 提供 aria-label 或 aria-labelledby2. 支持键盘导航 五、高级用法和集成1. …

leetcode-215. 数组中的第K个最大元素

题目描述 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入: [3,2,1,5…