awk脚本

2023-11-09

编写awk脚本

1. 从 Hello, World 开始

we create a file named test that contains a single line. This example shows a script that contains the print statement:

$ echo 'this line of data is ignored' > test
$ awk '{ print "hello, world"}' test

这个脚本只有一个动作, 被放在{}中. 这个动作是为每行的输出执行print语句.
在这里test文件只有一行, 所以 这个动作只执行一次
注意, 读入的test文件里的行是不会输出的

Now let’s look at another example. Here , we use a file that contains the line “Hello, World. “

$cat test2
Hello, world

$awk '{print}' test2
Hello, world

这里输出是Hello world ,
执行不带参数的print语句 , print就只是把读入的行简单的输出, 如果test2中有多行, 同样的awk读入几行就输出几行Hello world

上面的例子说明awk的运行是依赖它读取的内容, 也就是说当awk的输入为空的时候 它什么都不会做 (BEGIN部分除外)
比如

$ > test
$ awk '{print "hello world"}' test
$

当你运行一个awk程序 , 它从你提供的文件来读取, 检查awk指令语法, 然后awk 尝试把文件的每一行作为输入 来执行指令 , 所以只有当awk冲文件中读取到内容才执行动作

我们可以自己检验 输入第一个例子 但是 不输入文件名
你会发现awk 希望从键盘得到输入 它才会执行print指令:
敲几下回车 然后输入”EOF”(一般是CTRL-D) , 每当你输入一次回车
都会执行print “hello, world”这个动作

除了上面两中hello world方法外, 还有另一种hello world 可以让awk不需要输入就执行动作的方法. 这个方法就是在动作的前面使用BEGIN参数.

begin 参数指定 在读到输入的第一行之前执行动作

$ awk 'BEGIN {print "Hello, world"}'
Hello, world

当awk程序只有一个BEGIN部分,而没有其他语句,awk将不处理任何输入

$ awk 'BEGIN{}' xxxx

//正常执行 不关xxxx文件存不存在  因为语法正确 只有一个BEGIN部分 awk执行BEGIN后直接退出

awk 编程模型

理解awk为程序员提供的基本模型是很重要的 . 为什么awk对其他编程语言来说更易学 , awk 提供一些已经定义好的并且有用的模型是原因之一
awk 程序由被我们称为 main input loop 组成
一次循环就处理一次 , 直到出现某种情况结束. 你不需要自己来写这个循环
它已经在你写的代码的框架之中了.main input look 在awk中是每从输入中读去一行就进行一次新的处理 在别的语言中,你还 要自己创建这么个main input loop 来打开文件 并一次读一行, 这对于处理很多工作是没有必要的, 而awk让你编程更容易

当有多行输入时awk就执行多次, 就象hello world例子中, 只有从输入读取到一行时, 它才执行 , 当没有输入可读就结束

awk 允许两种方法 在读到输入前和读取输入后执行你的动作
也就是说 你可以在main input loop之前和 main input loop结束后执行一些处理动作,使用BEGIN和END过程

你可以认为awk脚本隐含3个主要部分: 读取输入前干什么 读取时干什么 读取后干什么
awk一般的工作都是在main input loop中 也就是真正关心的是读取的行
这个过程你的awk动作将对每一行应用

模式的匹配

其实就是 用RE匹配读入的行

hello word 脚本没有演示awk在模式匹配中的强大
当awk读一行就测试这行是否模式匹配脚本中的规则 只有符合模式匹配的行才作为动作的处理对象 如果没有指定动作 , 匹配的行将进行打印
考虑下面的指令

/^$/ { print "This is a blank line." }

如果读取的输入是空那么打印 这里模式的匹配是一个RE指定空行
我们把上面的指令放到一个名为 awkscr 的脚本中 , test文件作为输入, test内容是3个空行 然后使用下面的命令来执行脚本

$ awk -f awkscr test
This is a blank line.
This is a blank line.
This is a blank line.

脚本告诉我们test 中有3空行, 忽略非空的行
我们再来加点规则到脚本中 现在这个脚本用来分析输入 并分类读入的每行是数字 字符还是空行

# test for integer, string or empty line.
/[0-9]+/    { print "That is an integer" }
/[A-Za-z]+/ { print "This is a string" }
/^$/        { print "This is a blank line." }

下面是运行这个就脚本 从标准输入来读取

$ awk -f awkscr
4
That is an integer
t
This is a string
4T
That is an integer
This is a string
RETURN
This is a blank line.
44
That is an integer
CTRL-D
$

注意 当输入为4T时被表示既是文本也是字符. 一行可以匹配多个规则 , 你可以写严格一点的规则来防止一行匹配多个规则 你也可以写动作来跳过脚本中的一部分

注释

adding comments as you write the scripts is a good practice. A comment begins with the “#” character and ends at a newline.

As we begin writing scripts, we’ll use comments do describe the action:

#  blank.awk -- Print message for each blank line.
/^$/ { print "This is a blank line." }

this comment offers the name of the script, blank.awk, and briefly describes what the script does.

For instance, in the next section, we are going to look at writing a script that read a file containing names and phone numbers. The introductory comments for this program should be:

# blocklist.awk -- print name and address in block form.
# fields: name, company, street, city, state and zip, phone

It is useful to embed this information in the script because the script won’t work unless the structure of the input file corresponds to that expected by the person who wrote the script.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

awk脚本 的相关文章

  • 这种 bash 文件名提取技术有何用途?

    我有一部分 bash 脚本正在获取不带扩展名的文件名 但我试图了解这里到底发生了什么 是做什么用的 有人可以详细说明 bash 在幕后做了什么吗 如何在一般基础上使用该技术 bin bash for src in tif do txt sr
  • 从 Python 访问 802.11 无线管理帧

    我想从 Linux 上的 Python 嗅探 802 11 管理 探测请求 帧 这可以从 Scapy 中实现 如下所示 coding utf 8 from scapy all import def proc p if p haslayer
  • 未找到 Gem 命令

    我已经在 Ubuntu 10 10 32 位上安装了 gem apt get install gem y 但当我尝试跑步时 gem install something gem 我收到未找到命令的错误 bash gem command not
  • 错误:命令“c++”失败,退出状态为 1

    所以我尝试按照以下说明安装 Pyv8https andrewwilkinson wordpress com 2012 01 23 integrating python and javascript with pyv8 https andre
  • 使用 gcc 理解共享库

    我试图理解 C 中共享库的以下行为 机器一 cat one c include
  • 如何设置Java线程的CPU核心亲和力?

    我搜索了以前关于类似主题的帖子 但找不到合适的答案 因此提出这个问题 非常感谢您帮助回答 我知道在 Linux 中通过任务集命令设置进程与特定 CPU 核心的关联性 但我想设置 Java 线程与特定 cpu 核心的亲和力 以便属于同一进程的
  • 在 Docker 容器中以主机用户身份运行

    在我的团队中 我们在进行开发时使用 Docker 容器在本地运行我们的网站应用程序 假设我正在开发 Flask 应用程序app py具有依赖关系requirements txt 工作流程大致如下 I am robin and I am in
  • 无需 root 访问权限即可安装 zsh? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 有可能 以及如何 我确实需要在几台具有 ssh 访问权限 但没有 root 访问权限 的远程计算机上使用此功能 下载 zsh wget O zsh t
  • 将node.js +expressjs应用程序的NODE_ENV设置为ubuntu下的守护进程

    我按照这些说明让守护进程正常工作 http kevin vanzonneveld net techblog article run nodejs as a service on ubuntu karmic http kevin vanzon
  • 裸机交叉编译器输入

    裸机交叉编译器的输入限制是什么 比如它不编译带有指针或 malloc 的程序 或者任何需要比底层硬件更多的东西 以及如何才能找到这些限制 我还想问 我为目标 mips 构建了一个交叉编译器 我需要使用这个交叉编译器创建一个 mips 可执行
  • 为什么docker容器提示“权限被拒绝”?

    我使用以下命令来运行 docker 容器 并从主机映射目录 root database 到容器 tmp install database docker run it name oracle install v root database t
  • SMP 上如何处理中断?

    SMP 对称多处理器 多核 机器上如何处理中断 内存管理单元是只有一个还是多个 假设两个线程 A 和 B 运行在不同的内核上 同时 访问页表中不存在的内存页面 在这种情况下 将会出现页面错误 并从内存中引入新页面 将会发生的事件的顺序是什么
  • 在非实时操作系统/内核上执行接近实时任务的最佳方法是什么?

    在一台 GNU Linux 机器上 如果想要执行 实时 亚毫秒级时间关键 任务 您几乎总是必须经历漫长 复杂且容易出现问题的内核补丁过程 以提供足够的支持 1 http en wikipedia org wiki RTLinux Backg
  • 如何使用 bash 中提供的工具生成一系列非周末日期?

    我想生成一个文件列表 其中名称包含 filename date 例如file 20111101 file 20120703 开始November 1 2011直到今天 应该不包括周末 Thanks 2011年试试这个 for y in 20
  • 运行 shell 命令并将输出发送到文件?

    我需要能够通过 php 脚本修改我的 openvpn 身份验证文件 我已将我的 http 用户设置为免通 sudoer 因为这台机器仅在我的家庭网络中可用 我目前有以下命令 echo shell exec sudo echo usernam
  • 如何在linux中使用iptables将http和https流量转发到透明代理[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 help on topic 如果您认为该问题与主题相关另一个 St
  • 在嵌入式系统上将内核控制台发送到哪里?

    我正在开发一个嵌入式系统 该系统当前通过串行端口 1 上的控制台输出启动 Linux 使用启动加载程序中的控制台启动参数 然而 最终我们将使用这个串行端口 内核控制台输出的最佳解决方案是什么 dev null 能否以某种方式将其放在 pty
  • 为什么 call_usermodehelper 大多数时候都会失败?

    从内核模块中 我尝试使用 call usermodehelper 函数来执行可执行文件 sha1 该可执行文件将文件作为参数并将文件的 SHA1 哈希和写入另一个文件 名为输出 可执行文件完美运行 int result 1 name hom
  • 查找并删除超过 x 天的文件或文件夹

    我想删除超过 7 天的文件和文件夹 所以我尝试了 17 07 14 email protected cdn cgi l email protection find tmp mindepth 1 maxdepth 1 ctime 7 exec
  • Unix 中的访问时间是多少

    我想知道访问时间是多少 我在网上搜索但得到了相同的定义 读 被改变 我知道与touch我们可以改变它 谁能用一个例子来解释一下它是如何改变的 有没有办法在unix中获取创建日期 时间 stat结构 The stat 2 结构跟踪所有文件日期

随机推荐

  • Blender2.9基础七:外部插件篇

    一 插件安装 1 安装插件 2 插件显示位置 二 材质贴图相关插件 1 GrabDoc 贴图烘培插件 GrabDoc可以运行一键式场景设置 然后开始建模 对形状进行建模后 甚至在建模阶段 你可以实时预览材质在视口中的外观 主要特点 实时材质
  • unity3D 脚本中按键或鼠标输入响应函数

    简单地总结一下 unity中脚本实现输入 键盘和鼠标 的响应事件函数 不够完善 以后碰到再慢慢添加 键盘输入 1 Input GetKey up 按住键盘上键 2 Input GetKey KeyCode UpArrow 按住键盘上键 Ke
  • JS实现将数组中某个属性值相同的元素,放在一起

    function sortArr arrList str var arr 大数组 t 临时属性值相同数组 临时的变量 tmp if arrList length gt 0 tmp arrList 0 str 将相同类别的对象添加到同一个数组
  • [从零开始学习FPGA编程-44]:视野篇 - 集成电路助力数字化时代高质量发展-1-集成电路芯片主要形态

    目录 前言背景 什么是集成电路 什么是数字化时代
  • 为什么小程序预览时必须打开‘调试工具vconsole’才能正常运行?

    这是因为没有为小程序配置域名导致的 预览或者使用小程序体验版的时候 小程序会自动校验你是否配置了合法的域名 如果没有配置 还是使用的ip地址 这样就会造成一个现象 在开发工具上以及真机调试时 都能正常运行 但预览就不行 但只要在预览时 打开
  • c++如何使用yaml来进行配置

    c 如何使用yaml来进行配置 yaml的基本语法可以参考这个博客 https www cnblogs com sddai p 9626392 html yaml的使用也可以参考这个博客 https www it610 com articl
  • 基础算法题——迷宫(递推)

    迷宫 题目链接 解题思路 暴力法 利用 dfs 遍历每一条可能的路径 将遍历的权值和不断取余 不足 当 n m 取较大的情况下 所遍历的路径可能会暴增 出现超时的情况 递推法 从题目上我们可以发现 最终的权值和是要对 mod 取余的 利用这
  • 查询SQLSERVER执行过的SQL记录(历史查询记录)

    有的时候 需要知道近段时间SQLSERVER执行了什么语句 可以用下面的方法 SELECT TOP 1000 QS creation time SUBSTRING ST text QS statement start offset 2 1
  • Linux教程系列 pdf下载(鸟哥私房菜等)

    鸟哥的Linux私房菜 基础篇 第四版 pdf 下载 LINUX内核设计与实现 pdf 下载 Linux 操作系统 基础操作 教学 doc 下载 linux内核深入剖析基于0 11 pdf 下载 Linux系统命令及其使用详解 doc 下载
  • 静态变量与动态变量的区别

    目录 一 定义 1 变量与常量 2 局部变量 局部变量 定义在函数中的变量 3 全局变量 4 动态变量和静态变量 二 区别 1 局部变量与全局变量的对比 2 静态变量与动态变量 一 定义 1 变量与常量 变量 指的是在程序运行过程中 可以通
  • Linux 高级进程管理

    1 让出处理器 Linux提供一个系统调用运行进程主动让出执行权 sched yield 进程运行的好好的 为什么需要这个函数呢 有一种情况是用户空间线程的锁定 如果一个线程试图取得另一个线程所持有的锁 则新的线程应该让出处理器知道该锁变为
  • 动态sql MyBatis处理多对一,一对多映射关系

    MyBatis处理模糊查询 1 用 符代替 接参 避免 占位符被解析成 在字符串中无法接参 select from user where username like name 2 使用sql语句中字符串拼接的函数 select from u
  • 微信小程序背景图片设置问题

    我们都知道 用css给网页设置背景图片 可以导入网络图片和本地图片 1 网络图片 元素定位 background image url https timgsa baidu com timg image quality 80 size b99
  • CUDA error: CUBLAS_STATUS_EXECUTION_FAILED when calling ‘cublasSgemm’

    运行transformer模型是报错如题 1 减小batch size 原因是调用cublas函数时会生成句柄 占用一定的内存 确保剩余内存够使用 2 gpu驱动版本和cuda torch版本的匹配问题 低版本的gpu驱动 尝试换成11 0
  • 怎么上传本地项目或文件到SVN服务器

    实验需要将本地的文件上传到SVN的doc文件夹下 在桌面右击 TortoiseSVN gt Repo brower gt 输入你的仓库的url gt 输入用户姓名和密码 即可访问到svn 右键点击Add File即可添加要上传的文件 如下图
  • c++文件输入与输出

    基于流的文件IO 头文件 ofstream 写文件 ifstream 读文件 fstream 读写文件 using namespace std 打开文件 std ifstream fin xxx txt std ifstream fin f
  • 几个更优雅、更高效 Pythonic 代码写法!

    本文分享几个鲜为人知的 Pythonic 技巧 这些技巧非常有用 但并不广为人知 通过学习和使用这些技巧 可以帮你节省时间和精力 并使你的代码更加优雅和高效 1 三元运算符 三元运算符是 if else 语句的简写 语法是value if
  • Flink自定义HBaseSink类

    文章目录 HBaseCell类 HBaseSink类 HBaseCell类 package com vic flink entity import lombok Data import java util HashMap Data publ
  • cookie原理详解及单点登录原理

    cookie一般是用来客户端存储信息的 用它可以进行用户信息的检验 实际案例 单点登录 cookie的原理 第一次访问网站的时候 浏览器发出请求 服务器响应请求后 会将cookie放入到响应请求中 通过Set Cookie字段 在浏览器第二
  • awk脚本

    编写awk脚本 1 从 Hello World 开始 we create a file named test that contains a single line This example shows a script that cont