windows ubuntu sed,awk,grep篇,8,Awk 语法和基础命令

news2024/11/28 11:29:54

目录

51.Awk 命令语法

52.Awk 程序结构(BEGIN,body,END)区域

53.打印命令

54.模式匹配


Awk 是一个维护和处理文本数据文件的强大语言。在文本数据有一定的格式,即每行数据包
含多个以分界符分隔的字段时,显得尤其有用。即便是输入文件没有一定的格式,你仍然可
以使用 awk 进行基本的处理。 Awk 当然也可以没有输入文件,那不是必须的。简言之, AWK
是一种能处理从琐碎的小事到日常例行公事的强大语言。
学习 AWK 的难度要比学习其他任意语言的难度都小。如果你已经掌握了 C 语言,那么你会
发现学习 AWK 将会是如此简单和容易。 AWK 最开始由三个人开发—— A.Aho B.W.Kernighan P.Weinberger 。所有 AWK 的名字来
自他们名字的第一个字母。
下面是 AWK 的几个变种:
  AWK 是最原始的 AWK
  NAWK new AWK
  GAWK GNU AWK 。所有 linux 发行版都默认使用 GAWK ,它和 AWK 以及 NAWK
完全兼容。
本书包含了原始 AWK 的所有基础功能,以及 GAWK 特有的一些高级功能。在安装了 NAWK
GAWK 的操作系统上,你仍然可以直接使用 awk 命令,它会根据情况调用 nawk gawk
linux 系统为例,你会看到 awk 是一个指向 gawk 的符号链接,所以在 linux 上执行 awk
gawk 将会调用 gawk
$ ls -l /bin/awk /bin/gawk
lrwxrwxrwx 1 root root 4 Apr 8 2011 /bin/awk -> gawk
-rwxr-xr-x 1 root root 319336 Dec 3 2008 /bin/gawk
本书示例将用到下面三个文件,请先建立它们,然后用它们来运行所有示例。
employee.txt 文件
employee.txt 文件以逗号作为字段分界符,包含 5 个雇员的记录,其格式如下:
employee-number,employee-name,employee-title
建立该文件 :
$ vi employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
items.txt 文件
items.txt 是一个以逗号作为字段分界符的文本文件,包含 5 条记录,其格式如下:
items-number,item-description,item-category,cost,quantity-available
建立该文件 :
$ vi items.txt
101,HD Camcorder,Video,210,10
102,Refrigerator,Appliance,850,2
103,MP3 Player,Audio,270,15
104,Tennis Racket,Sports,190,20
105,Laser Printer,Office,475,5
items-sold.txt 文件 items-sold.txt 是一个以空格作为字段分界符的文本文件,包含 5 条记录。每条记录都是特定
商品的编号以及当月的销售量 (6 个月 ) 。因此每条记录有 7 个字段。第一个字段是商品编号,
第二个字段到第七个字段是 6 个月内每月的销售量。其格式如下:
item-number qty-sold-month1 qty-sold-month2 qty-sold-month3 qty-sold-month4
qty-sold-month5 qty-sold-month6
建立该文件 :
$ cat items-sold.txt
101 2 10 5 8 10 12
102 0 1 4 3 0 2
103 10 6 11 20 5 13
104 2 3 4 0 6 5
105 10 2 5 7 12 6

51.Awk 命令语法

Awk 基础语法 :
Awk –Fs ‘/pattern/ {action}’ input-file
(或者)
Awk –Fs ‘{action}’ input-file
上面语法中:
z -F 为字段分界符。如果不指定,默认会使用空格作为分界符。
z /pattern/ {action} 需要用单引号引起来。
z /pattern/ 是可选的。如果不指定, awk 将处理输入文件中的所有记录。如果指定一
个模式, awk 则只处理匹配指定的模式的记录。
z {action} awk 命令,可以是单个命令,也可以多个命令。整个 action( 包括里面的
所有命令 ) 都必须放在 { } 之间。
z Input-file 即为要处理的文件
下面是一个演示 awk 语法的非常简单的例子 :
$ awk -F: '/mail/ {print $1}' /etc/passwd
mail
mailnull
这个例子中 :
z -F 指定字段分界符为冒号,即各个字段以冒号分隔。请注意,你也可以把分界符
用双引号引住, -F”:” 也是正确的。
z /mail/ 指定模式, awk 只会处理包含关键字 mail 的记录
z {print $1} 动作部分,该动作只包含一个 awk 命令,它打印匹配 mail 的每条记录的
1 个字段
z /etc/passwd 即是输入文件
awk 命令放入单独的文件中(awk 脚本)当需要执行很多 awk 命令时,可以把/pattern/{action}这一部分放到单独的文件中,然后调 用它:
awk –Fs –f myscript.awk input-file
myscript.awk 可以使用任意扩展名(或者不用扩展名)。但是加上扩展名.awk 便于维护,也可
以在这个文件中设置字段分界符(后面详述),然后调用:
awk –f myscript.awk input-file

52.Awk 程序结构(BEGIN,body,END)区域

典型的 awk 程序包含下面三个区域 :
1. BEGIN 区域
Begin 区域的语法 :
BEGIN { awk-commands }
BEGIN 区域的命令只最开始、在 awk 执行 body 区域命令之前执行一次。
z BEGIN 区域很适合用来打印报文头部信息,以及用来初始化变量。
z BEGIN 区域可以有一个或多个 awk 命令
z 关键字 BEGIN 必须要用大写
z BEGIN 区域是可选的
2. body 区域
body 区域的语法 :
/pattern/ {action}
body 区域的命令每次从输入文件读取一行就会执行一次
z 如果输入文件有 10 行,那 body 区域的命令就会执行 10 ( 每行执行一次 )
z Body 区域没有用任何关键字表示,只有用正则模式和命令。
3. END block
END 区域的语法 :
END { awk-commands }
END 区域在 awk 执行完所有操作后执行,并且只执行一次。
z END 区域很适合打印报文结尾信息,以及做一些清理动作
z END 区域可以有一个或多个 awk 命令
z 关键字 END 必须要用大写
z END 区域是可选的
Awk 的执行流程
下面的例子包含上上述的三个区域:
$ awk 'BEGIN { FS=":";print "----header----" } \
/mail/ {print $1} \
END {print "----footer----"}' /etc/passwd
----header----
mail
mailnull
----footer----
提示:如果命令很长,即可以放到单行执行,也可以用 \ 折成多行执行。上面的例子用 \ 把命
令折成了 3 行。
在这个例子中: z BEGIN { FS=”:”;print “----header----“ } BEGIN 区域,它设置了字段分界符变量 FS(
文详述 ) 的值,然后打印报文头部信息。这个区域仅在 body 区域循环之前执行一次。
z /mail/{print $1} body 区域,包含一个正则模式和一个动作,即在输入文件中搜索
包含关键字 mail 的行,并打印第一个字段。
z END {print “----footer----“ } END 区域,打印报文尾部信息。
z /etc/passwd 是输入文件,每行记录都会执行一次 body 区域里的动作。
上面的例子中,除了可以在命令行上执行外,还可以通过脚本执行。
首先建立下面的文件 myscript.awk, 它包含了 begin,body end
$vi myscript.awk
BEGIN {
FS=":"
print "---header---"
}
/mail/ {
print $1
}
END {
print "---footer---"
}
然后,如下所示,在 /etc/passwd 上执行 myscript.awk 文件:
$awk -f myscript.awk /etc/passwd
---header---
mail
---footer---
请注意, awk 脚本中,注释以 # 开头。如果要编写复杂的 awk 脚本,最后接受下面的建议:
*awk 文件中写上足够多的注释,这样以后再次使用该脚本时,更易于读懂。
下面是随机列出的一些简单的例子,用例演示 awk 各个区域的不同组合方式:
只有 body 区域 :
awk –F: ‘{ print $1 }’ /etc/passwd
同时具有 begin,body end 区域 :
awk –F: ‘BEGIN{printf “username\n-------\n”}\
{ print $1 }\
END {print “----------“ }’ /etc/passwd
只有 begin body 区域 :
Awk –F: ‘BEGIN {print “UID”} {print $3}’ /etc/passwd
关于使用 BEGIN 区域的提示 :
只使用 BEGIN 区域在 awk 中是符合语法的。在没有使用 body 区域时,不需要指定输入文件,
因为 body 区域只在输入文件上执行。所以在执行和输入文件无关的工作时,可以只使用
BEGIN 区域。下面的不少例子中,只包含 BEGIN 区域,用来说明 awk 的不同部分是如何执行
的。你可以因地制宜地使用下面的例子。
只包含 BEGIN 的简单示例 :
$awk ‘BEGIN { print “Hello,World!” }’
Hello World!
多个输入文件 :
注意,可以为 awk 指定多个输入文件。如果指定了两个文件,那么 body 区域会首先在第一
个文件的所有行上执行,然后在第二个文件的所有行上执行。
多个输入文件示例 :
$awk 'BEING { FS=":";print "---header---" }\
/mail/ {print $1}\
END { print "---footer---"}' /etc/passwd /etc/group
mail:x:8:12:Mailer
mail:x:12:
maildrop:!:59:
---footer---
注意,即是指定了多个文件, BEGIN END 区域,仍然只会执行一次。

53.打印命令

默认情况下, awk 的打印命令 print( 不带任何参数 ) 会打印整行数据。下面的例子等价于 ”cat
employee.txt” 命令 .
$awk '{print}' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
也可以通过传递变量 ”$ 字段序号 作为 print 的参数来指定要打印的字段。我们猜想例子应该
只打印雇员名称 ( 2 个字段 )
$awk '{print $2}' employee.txt
Doe,CEO
Smith,IT
Reddy,Sysadmin
Ram,Developer
Miller,Sales
等等,这个输出好像和预期不符。它打印了从姓氏开始直到记录结尾的所有内容。这是因为
awk 默认的字段分隔符是空格, awk 准确地执行了我们要求的动作,它以空格作为分隔符,
打印第 2 个字段。当使用默认的空格作为字段分隔符时, 101,Johne 变成了第一条记录的第
一个字段, Doe,CEO 变成了第二个字段。因此上面例子中, awk Doe,CEO 作为第二个字段
打印出来了。
要解决这个文件,应该使用-F 选项为 awk 指定一个逗号”,”最为字段分隔符。
$awk -F ',' '{print $2}' employee.txt
John Doe Jason Smith
Raj Reddy
Anand Ram
Jane Miller
当字段分隔符是单个字符时,下面的所有写法都是争取的,即可以把它放在单引号或双引号
中,或者不使用引号:
awk –F ‘,’ ‘{print $2}’ employee.txt
awk –F “,” ‘{print $2}’ employee.txt
awk –F , ‘{print $2}’ employee.txt
ᨀ示 : 也可使用 FS 变量来达到同样的目的。后面会介绍这个 awk 内置变量的用法。
一个简单的例子,用来输出雇员姓名,职位,同时附带 header footer 信息 :
$awk 'BEGIN{FS=",";print "---------\nName Title\n------------\n";}\
{print $2,"\t",$3}\
END {print "-------------------"}' employee.txt
---------
Name Title
------------
John Doe CEO
Jason Smith IT Manager
Raj Reddy Sysadmin
Anand Ram Developer
Jane Miller Sale
这个例子中,输出结果各字段并没有很好地对齐,后面章节将会介绍如何处理这个问题。这
个例子还展示了如何使用 BEGIN 来打印 header 以及如何使用 END 来打印 footer.
请注意, $0 代表整条记录。下面两个命令是等价的,都打印 employee.txt 的所有行 :
awk ‘{print}’ employee.txt
awk ‘{print $0}’ employee.txt

54.模式匹配

你可以只在匹配特殊模式的行数执行 awk 命令。
下面的例子只打印管理者的姓名和职位:
$awk -F ',' '/Manager/ {print $2,$3}' employee.txt
Jason Smith IT Manager
Jane Miller Sales Manager
下面的例子只打印雇员 id 102 的雇员的信息:
$awk -F ',' '/^102/{print "Emp id 102 is",$2}' \
> employee.txt
Emp id 102 is Jason Smith

资料来源于《SedandAwk101Hacks》,大家有兴趣可以买一本,也可以关注我,我更新完它。

曾经,我花费大半月将它们跑完,现在啥都忘了,还是要常用。

只为学习交流,不为获利,侵权联系立删。

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

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

相关文章

有什么好用的足球数据分析工具,可以生成可靠的投注策略?

在寻找好用的足球数据分析工具以生成可靠的投注策略时,有几个值得考虑的选项。以下是一些工具和建议: 乐彩数据分析:这款工具以其精准的预测和高达70%以上的准确率而受到赞誉。它利用大数据算法进行预测,相比个人预测更加准确。此…

集成框架 -- OSS

前言 接入oss必须有这两个文档基础 使用STS临时访问凭证访问OSS_对象存储(OSS)-阿里云帮助中心 前端上传跨域 正文 sts前后端通用,开通图示 AliyunSTSAssumeRoleAccess 后端实现代码 public static void main(String[] args) {String regionId "cn-ha…

邦注科技即热式节能模温机 模温机的工作原理

模温机是一种用于控制模具温度的设备,主要用于塑料注塑、压铸、橡胶成型等工艺中。 其工作原理主要包括以下几个步骤: 加热阶段: 当模具需要加热时,双温模温机会启动加热系统,将热传导油或热传导水加热至设定温度。加…

使用MATLAB/Simulink的PID控制系统设计和自动调整

书籍:Pid Control System Design and Automatic Tuning Using Matlab/Simulink 作者:Liuping Wang 出版:Wiley-IEEE Press 书籍下载-《使用MATLAB/Simulink的PID控制系统设计和自动调整》本书涵盖了具有操作约束的PID控制系统的设计、实施…

[Collection与数据结构] 七大排序算法汇总

1.概述 1.1 概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排…

合泰杯(HT32F52352)RTC的应用(计时)--->掉电不丢失VBAT(代码已经实现附带源码)

摘要 在HT32F52352合泰单片机开发中,rtc在网上还是挺少人应用的,找了很久没什么资料,现在我根据手册和官方的代码进行配置理解。 RTC在嵌入式单片机中是一个很重要的应用资源。 记录事件时间戳:RTC可以记录事件发生的精确时间&…

简单记录一下在linux中安装pytorch成功!

1. 安装版本 pytorch版本:2.0.0 torchvision版本:0.15.0 torchaudio版本:2.0.0 cuda版本:cuda11.8 python版本:3.9 # CUDA 11.8 pip install torch2.0.0cu118 torchvision0.15.1cu118 torchaudio2.0.1 --index-url https://download.py…

最详细的SSL证书说明及免费申请方法

JoySSL官网 注册码230918 SSL(Secure Sockets Layer)证书,现在通常指的是其继任者TLS(Transport Layer Security)证书,是确保数据传输安全的核心技术之一。本文将深入探讨SSL证书的工作原理、重要性、类型以…

CSS-IN-JS Emotion

为什么会有css-in-js 优点 缺点 使用emotion插件库 npm i emotion/core emotion/styled使用时需要解析css属性 使用方式一: 通过注释告诉babel不讲jsx转化为react.create Element的调用,而是转化为jsx语法。会导致一个警告react未使用。 使用方式二&am…

windows11安装nginx

1.解压nginx安装包到没有中文的目录 2.双击运行nginx.exe 3.任务管理器查看是否有nginx进程 4.任务管理器->性能->资源监视器 5.网络->侦听端口,查看nginx侦听的端口,这里是90端口

JAVA顺序表相关习题1

1.笔试题:cvte str1 :welcome to cvte str2:come 描述:删除第一个字符串当中出现的所有的第二个字符串的字符!结果:wlt vt 要求 用ArrayList完成! public class Test {public static List<Character> findSameWords(String u1, String u2){List<Character> listn…

IoT Scenario: Smart Retail System-Multiple Sources and Multiple Terminals

物联网/大数据可视化领域发文可以联系&#xff1a;nascimsina.com IoT Scenario: Smart Retail System Overview The use of IoT in the retail industry enhances customer experiences, optimizes inventory management, and provides valuable insights into consumer beh…

S32K3系列 --- PTE13用作ADC采集电压异常问题

一、前言 当我们在将PTE13引脚配置未ADC功能的时候, 发现采集的电压异常。 二、问题排查 在S32DS的引脚配置里面,我们发现PTE13这个引脚默认是专用信号VRC_CTRL 但是在官方的IO表里也没有说默认路由到VRC_CTRL, 这个就很蛋疼。 通过芯片手册,我们发现: VRC_CTRL可以和B…

selenium 4.x 入门(环境搭建、八大元素定位)

背景 Web自动化测现状 1. 属于 E2E 测试 2. 过去通过点点点 3. 好的测试&#xff0c;还需要记录、调试网页的细节 一、selenium4.x环境搭建 一键搭建 pip3 install webdriver-helper 安装后自动的完成&#xff1a; 1. 查看浏览器的版本号 2. 查询操作系统的类型…

LeetCode in Python 10. Regular Expression Matching (正则表达式匹配)

正则表达式匹配涉及到两个字符串的匹配问题&#xff0c;类似于寻找最大公共子串&#xff0c;可使用动态规划思想解决。重点和难点在于如何构建正确的状态转移方程。 示例&#xff1a; 图1 正则表达式匹配输入输出 代码&#xff1a; class Solution:def isMatch(self, s: st…

二、再识VUE-MVVM

一、初识VUE 二、再识VUE-MVVM 三、VUE数据代理 MVVM Vue.js 专注于 MVVM 模型的 ViewModel 层。它通过双向数据绑定把 View 层和 Model 层连接了起来。实际的 DOM 封装和输出格式都被抽象为了 Directives 和 Filters。 ViewModel 一个同步 Model 和 View 的对象。在 Vue.js…

计算机复试项目:SpringCloud实战高并发微服务架构设计

秒杀购物商城--环境搭建 秒杀购物商城基础服务组件--详细介绍 秒杀购物商城基础服务--权限中心 秒杀购物商城业务服务--收货地址 秒杀购物商城业务服务--秒杀活动服务 秒杀购物商城--购物车的功能设计及分析 秒杀购物商城基础服务-用户中心 秒杀购物商城业务服务--商品中…

二分查找法实例

本文是根据数据结构中常常提到的二分法而作的一篇博客&#xff0c;主要通过一个二分法实例进行展开说明&#xff1a; 实例内容 通过一个二分法函数来寻找某个数是否在给定的数组中&#xff1b; 代码展示 # 执行二分查找法的算法函数 # 二分法查找的对象必须是一个有序的集…

初步认识Vscode

4.26初步认识Vscode &#xff08;一&#xff09;快捷键的使用 1. 打开控制端 ctrl ~2. 结束终端 ctrl c3. 多行同时对齐输出 按住shift alt 光标多选4. 多行同时任意位置输出 按住alt 光标单点你想要输入的位置5. 代码太长了&#xff0c;想混行编辑 alt z6. 打开设置控制…

工信部CAPPVD公布24年一季度积分情况,海云安位居全国第二!

近日&#xff0c;工业和信息化部移动互联网APP产品安全漏洞专业库&#xff08;以下简称“CAPPVD漏洞库”&#xff09;根据《CAPPVD漏洞库支撑单位能力评定办法》和综合24年第一季度的漏洞报送、重要行业企事业单位漏洞加分、高危漏洞处置加分、标准支撑等&#xff0c;最终公布了…