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

目录

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.mfbz.cn/a/583118.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在使用ChatGPT之前,你真的知道这些吗?|TodayAI

当OpenAI在2022年11月发布ChatGPT时,它标志着技术领域的一次重大突破。ChatGPT是一个高级AI聊天机器人,它的功能几乎令人难以置信。过去的AI技术多年来一直在逐步发展,早期版本通常只能生成毫无意义的文本或质量较差的图片。这些早期的尝试虽…

安装 AngularJS

安装 AngularJS 文章目录 安装 AngularJS1. 使用在线 cdn2. 使用依赖管理工具 npm 1. 使用在线 cdn <!-- 1. 引入在线地址 --> <script src"http://code.angularjs.org/1.2.25/angular.min.js"></script><!-- 2. 下载到本地&#xff0c;引入文…

集合系列(二十二) -一文到你搞懂二叉树实现

一、介绍 在前面的文章中&#xff0c;我们对树这种数据结构做了一些基本介绍&#xff0c;今天我们继续来聊聊一种非常常用的动态查找树&#xff1a; 二叉查找树。 二叉查找树&#xff0c;英文全称&#xff1a;Binary Search Tree&#xff0c;简称&#xff1a;BST&#xff0c;…

js cookie和它的写入,读取,删除

什么是cookie Cookie 是直接存储在浏览器中的一小串数据&#xff0c;它们是 HTTP 协议的一部分 Cookie 通常是由 Web 服务器使用响应 Set-Cookie HTTP-header 设置的。然后浏览器使用 Cookie HTTP-header 将它们自动添加到&#xff08;几乎&#xff09;每个对相同域的请求中。…

升级价值主张 用友帮企业找到乘风破浪的“密码”

近期&#xff0c;用友发布了其战略级产品用友BIP的全新价值主张&#xff0c;将其从原来的“企业数智化 用友BIP”升级为“用友BIP 成就数智企业”。用友这次价值主张升级看似变动不大&#xff0c;实则大有深意。 顺势而为的主动升级 从当前数智化发展的形势来看&#xff0c;各…

牛客NC320 装箱问题【中等 动态规划,背包问题 C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/d195a735f05b46cf8f210c4ad250681c 几乎完全相同的题目&#xff1a; https://www.lintcode.com/problem/92/description 思路 动态规划都是递归递推而来。php答案是动态规划版本&#xff0c;递归版本有 测试用…

ios CI/CD 持续集成 组件化专题五-(自动发布私有库-组件化搭建)

一&#xff1a;手动发布私有库总结 手动发布pod私有库&#xff0c;需要进行如下几步操作&#xff1a; 1、修改完代码之后&#xff0c;需要提交代码push到git仓库。 2、给代码打tag。 3、修改podspec文件的version值&#xff0c;使其和设置的tag一直。 4、命令行执行pod repo…

【蓝桥杯省赛真题41】python搬运物品方案 中小学青少年组蓝桥杯比赛 算法思维python编程省赛真题解析

目录 python搬运物品方案 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python搬运物品方案 第十三届蓝桥杯青少年组python省赛比赛 一、题目…

【CGALDotNet】二维矢量多边形可视域计算(C#调用CGAL)

参考 CGALDotNet快速开始&#xff1a;https://blog.csdn.net/liqian_ken/article/details/138274933 CGAL二维可视域计算介绍&#xff1a;https://doc.cgal.org/latest/Visibility_2/index.html#visibility_2_introduction CGAL相关接口&#xff1a;https://doc.cgal.org/late…

明日周刊-第8期

现在露营的人越来越多了&#xff0c;都是带着帐篷或者遮阳篷聚在一起喝喝茶聊聊天&#xff0c;这是一种很好的放松方式。最近我养了一只金毛&#xff0c;目前两个月大&#xff0c;非常可爱。 文章目录 一周热点资源分享言论歌曲推荐 一周热点 一、人工智能领域 本周&#xff…

2024.4.29

模板类实现顺序栈 #include <iostream>using namespace std; template <typename T> class Seqlite{T data[30];int len0; public:void head_inst(T date);void head_dele();void show(); }; template <typename T> //头插函数 void S…

如何快速申请SSL证书实现HTTPS访问?

申请SSL证书最简单的方法通常涉及以下几个步骤&#xff0c;尽量简化了操作流程和所需专业知识&#xff1a; 步骤一&#xff1a;选择适合的SSL证书类型 根据您的网站需求&#xff0c;选择最基础的域名验证型&#xff08;DV SSL&#xff09;证书&#xff0c;它通常只需验证域名所…

OpenAI 新推出 AI 问答搜索引擎——SearchGPT 震撼登场

您的浏览器不支持 video 标签。 OpenAI-SearchGPT 近日&#xff0c;OpenAI 曝光了自己的一款令人瞩目的 AI 问答搜索引擎——SearchGPT。这款搜索引擎带来了全新的搜索体验&#xff0c;给整个行业带来了巨大的压力。 SearchGPT 支持多种强大的功能。首先&#xff0c;它能够通过…

新一代状态空间模型网络替代Transformer 综述

本文首先初步介绍了状态空间模型&#xff08;SSM&#xff09;的工作原理。然后&#xff0c;从多个方面回顾SSM的相关工作&#xff0c;包括SSM的起源和变化、自然语言处理、计算机视觉、图、多模态处理、多模态和多媒体、点云/事件流数据、时间序列数据等领域的相关工作。 此外…

网络安全设计的技术有哪些?

目录 1. 防火墙 2. 入侵检测系统&#xff08;IDS&#xff09;和入侵防御系统&#xff08;IPS&#xff09; 3. 身份和访问管理&#xff08;IAM&#xff09; 4. 数据加密 5. 网络分割和虚拟化 6. 安全信息和事件管理&#xff08;SIEM&#xff09; 7. 端点保护 8. 配置管理…

链表带环问题的方法证明

目录 一、带环问题的解决 1、固定思路 2、思路后的数学证明 3、不相遇的情况分析 二、环入口问题 ​编辑 1、固定思路 2、数学证明 三、求环的长度 一、带环问题的解决 1、固定思路 链表带环问题比较传统的思路是使用快慢指针&#xff0c;当快和慢指针相遇的时候那么…

工具篇--Window--常用工具命令汇总(持续更新)

文章目录 前言一、常用工具&#xff1a;1.1 window host 修改&#xff1a;1.2 window 端口占用&#xff1a;1.3 打开/关闭防火墙&#xff1a;1.4 JavaScript 对象或值转换为 JSON 字符串: 二、命令行&#xff1a;2.1 获取本机ip&#xff1a; 三、网页在线工具&#xff1a;3.1 本…

吴恩达深度学习笔记:深度学习的 实践层面 (Practical aspects of Deep Learning)1.9-1.10

目录 第一门课&#xff1a;第二门课 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第一周&#xff1a;深度学习的 实践层面 (Practical aspects of Deep Learning)…

LabVIEW自动剪板机控制系统

LabVIEW自动剪板机控制系统 随着工业自动化的快速发展&#xff0c;钣金加工行业面临着生产效率和加工精度的双重挑战。传统的手动或脚踏式剪板机已无法满足现代生产的高效率和高精度要求&#xff0c;因此&#xff0c;自动剪板机控制系统的研究与开发成为了行业发展的必然趋势。…

如何快速开发个性化回收小程序

回收小程序的开发无疑是提升回收业务效率的重要途径。它不仅可以清晰地列出各类回收物品&#xff0c;还能在微信、抖音、支付宝等多个平台同时上线&#xff0c;让回收服务触手可及。那么&#xff0c;如何以最快、最简单、最经济的方式上线这样一个小程序呢&#xff1f; 在这里&…
最新文章