没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
通用线程:Awk 实例,第 1 部分
捍卫 awk
在本系列文章中,我将使您成为精通 awk 的编码人员。我承认,awk 并没
有一个非常好听且又非常“时髦”的名字。awk 的 GNU 版本(叫作 gawk)听起来
非常怪异。那些不熟悉这种语言的人可能听说过 "awk",并可能认为它是一组
落伍且过时的混乱代码。它甚至会使最博学的 UNIX 权威陷于错乱的边缘(使他
不断地发出 "kill -9!" 命令,就象使用咖啡机一样)。
的确,awk 没有一个动听的名字。但它是一种很棒的语言。awk 适合于文
本处理和报表生成,它还有许多精心设计的特性,允许进行需要特殊技巧程序
设计。与某些语言不同,awk 的语法较为常见。它借鉴了某些语言的一些精华
部分,如 C 语言、python 和 bash(虽然在技术上,awk 比 python 和 bash 早创
建)。awk 是那种一旦学会了就会成为您战略编码库的主要部分的语言。
第一个 awk
让我们继续,开始使用 awk,以了解其工作原理。在命令行中输入以下命令:
您将会见到 /etc/passwd 文件的内容出现在眼前。现在,解释 awk 做了些什么。
调用 awk 时,我们指定 /etc/passwd 作为输入文件。执行 awk 时,它依次对
/etc/passwd 中的每一行执行 print 命令。所有输出都发送到 stdout,所得到的
结果与与执行 catting /etc/passwd 完全相同。
现在,解释 { print } 代码块。在 awk 中,花括号用于将几块代码组合到一
起,这一点类似于 C 语言。在代码块中只有一条 print 命令。在 awk 中,如果
只出现 print 命令,那么将打印当前行的全部内容。
这里是另一个 awk 示例,它的作用与上例完全相同:
在 awk 中, $0 变量表示整个当前行,所以 print 和 print $0 的作用完全
一样。
如果您愿意,可以创建一个 awk 程序,让它输出与输入数据完全无关的数据。
以下是一个示例:
如果您愿意,可以创建一个 awk 程序,让它输出与输入数据完全无关的数据。以下是一个
示例:
只要将 "" 字符串传递给 print 命令,它就会打印空白行。如果测试该脚本,将会发现对于
/etc/passwd 文件中的每一行,awk 都输出一个空白行。再次说明, awk 对输入文件中的每
一行都执行这个脚本。以下是另一个示例:
运行这个脚本将在您的屏幕上写满 hiya。:)
多个字段
awk 非常善于处理分成多个逻辑字段的文本,而且让您可以毫不费力地引用 awk 脚本中每
个独立的字段。以下脚本将打印出您的系统上所有用户帐户的列表:
上例中,在调用 awk 时,使用 -F 选项来指定 ":" 作为字段分隔符。awk 处理
print $1 命令时,它会打印出在输入文件中每一行中出现的第一个字段。以下是另一个示
例:
以下是该脚本输出的摘录:
!
"
#####
如您所见,awk 打印出 /etc/passwd 文件的第一和第三个字段,它们正好分别
是用户名和用户标识字段。现在,当脚本运行时,它并不理想 -- 在两个输出字
段之间没有空格!如果习惯于使用 bash 或 python 进行编程,那么您会指望
print $1 $3 命令在两个字段之间插入空格。然而,当两个字符串在 awk 程序中彼此相邻
时,awk 会连接它们但不在它们之间添加空格。以下命令会在这两个字段中插入空格:
以这种方式调用 print 时,它将连接 $1 、" " 和 $3 ,创建可读的输出。当然,如果
需要的话,我们还可以插入一些文本标签:
$%%
这将产生以下输出:
$
$
$
$
$!
$"
#####
外部脚本
将脚本作为命令行自变量传递给 awk 对于小的单行程序来说是非常简单的,而对于多行程
序,它就比较复杂。您肯定想要在外部文件中撰写脚本。然后可以向 awk 传递 -f 选项,以
向它提供此脚本文件:
&$#$'#
将脚本放入文本文件还可以让您使用附加 awk 功能。例如,这个多行脚本与前面的单行脚
本的作用相同,它们都打印出 /etc/passwd 中每一行的第一个字段:
()*+,
-.
这两个方法的差别在于如何设置字段分隔符。在这个脚本中,字段分隔符在代
码自身中指定(通过设置 FS 变量),而在前一个示例中,通过在命令行上向
awk 传递 -F":" 选项来设置 FS。通常,最好在脚本自身中设置字段分隔符,只
是因为这表示您可以少输入一个命令行自变量。我们将在本文的后面详细讨论
FS 变量。
BEGIN 和 END 块
通常,对于每个输入行,awk 都会执行每个脚本代码块一次。然而,在许多编
程情况中,可能需要在 awk 开始处理输入文件中的文本之
前
执行初始化代码。
对于这种情况,awk 允许您定义一个 BEGIN 块。我们在前一个示例中使用了
BEGIN 块。因为 awk 在开始处理输入文件之前会执行 BEGIN 块,因此它是初
始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全
局变量的极佳位置。
awk 还提供了另一个特殊块,叫作 END 块。awk 在处理了输入文件中的所有
行之后执行这个块。通常,END 块用于执行最终计算或打印应该出现在输出流
结尾的摘要信息。
规则表达式和块
awk 允许使用规则表达式,根据规则表达式是否匹配当前行来选择执行独立代
码块。以下示例脚本只输出包含字符序列 foo 的那些行:
&
当然,可以使用更复杂的规则表达式。以下脚本将只打印包含浮点数的行:
/012%#/013
表达式和块
还有许多其它方法可以选择执行代码块。我们可以将任意一种布尔表达式放在
一个代码块之前,以控制何时执行某特定块。仅当对前面的布尔表达式求值为
真时,awk 才执行代码块。以下示例脚本输出将输出其第一个字段等于 fred 的
所有行中的第三个字段。如果当前行的第一个字段不等于 fred ,awk 将继续处
理文件而不对当前行执行 print 语句:
..&
剩余32页未读,继续阅读
资源评论
- shangtian7062013-03-25感觉一般,有点看不懂,但是仔细研究有收获了。
- 擦梦的曲率2014-08-30边看边练,还是很有收获的
achilles0622
- 粉丝: 1
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- week6.1.7z
- 移动机器人自主路径规划之RRTStar算法MATLAB实现代码
- 基于Python+OpenCV+FFmpeg实现自动识别电影剪辑+分析剪辑主题颜色+源码+文档(毕业设计&课程设计&项目开发)
- 基于python的二手商品交易平台 python+django开发的供需平台
- 微信小程序源码 侧滑布局小程序 (源码下载 +内附使用说明)
- heima-JUC-资料
- coreg_FSL.sh
- ROS+YOLOV8+SLAM智能小车导航实战(四、激光雷达+SLAM建图)
- 什么是决策树,有哪些适用场景?
- 基于python开发的口红色号识别程序+源码+开发文档+源码解析(毕业设计&课程设计&项目开发)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功