位置: 编程技术 - 正文

awk基础知识小结第1/2页(awk入门)

编辑:rootadmin

1、使用规则

awk 适合于文本处理和报表生成,它还有许多精心设计的特性,允许进行需要特殊技巧程序设计。awk 的语法较为常见。它借鉴了某些语言的一些精华部分,如C 语言、python 和 bash。

第一个 awk让我们继续,开始使用 awk,以了解其工作原理。在命令行中输入以下命令:$ awk '{ print }' /etc/passwd您将会见到 /etc/passwd 文件的内容出现在眼前。现在,解释 awk 做了些什么。调用 awk 时,我们指定 /etc/passwd 作为输入文件。执行 awk 时,它依次对 /etc/passwd 中的每一行执行 print 命令。所有输出都发送到 stdout,所得到的结果与与执行catting /etc/passwd完全相同。

现在,解释 { print } 代码块。在 awk 中,花括号用于将几块代码组合到一起,这一点类似于 C 语言。在代码块中只有一条 print 命令。在 awk 中,如果只出现 print 命令,那么将打印当前行的全部内容。

这里是另一个awk 示例,作用与上例完全相同:$ awk '{ print $0 }' /etc/passwd

在 awk 中,$0 变量表示整个当前行,所以 print 和 print $0 的作用完全一样。

创建一个 awk 程序,让它输出与输入数据完全无关的数据。示例1:$ awk '{ print "" }' /etc/passwd只要将 "" 字符串传递给 print 命令,它就会打印空白行。测试该脚本,将会发现对于/etc/passwd文件中的每一行,awk 都输出一个空白行。由此可知,awk对输入文件中的每一行都执行这个脚本。

示例2:$ awk '{ print "hiya" }' /etc/passwd运行此脚本将在您的屏幕上写满 hiya。

2、处理多个字段awk 非常善于处理分成多个逻辑字段的文本,还可以引用 awk 脚本中每个独立的字段。打印系统上所有用户帐户的列表:$ awk -F":" '{ print $1 }' /etc/passwd上例中,调用awk时,使用 -F 选项来指定 ":" 作为字段分隔符。awk 处理 print $1 命令时,它会打印出在输入文件中每一行中出现的第一个字段。以下是另一示例:$ awk -F":" '{ print $1 $3 }' /etc/passwd

以下是该脚本输出的摘录:halt7operatorroot0shutdown6sync5bin1....etc.

如您所见,awk 打印出 /etc/passwd 文件的第一和第三个字段,它们正好分别是用户名和用户标识字段。现在,当脚本运行时,它并不理想--在两个输出字段之间没有空格!如果习惯于使用 bash 或 python 进行编程,那么您会指望 print $1 $3 命令在两个字段之间插入空格。然而,当两个字符串在 awk 程序中彼此相邻时,awk 会连接它们但不在它们之间添加空格。以下命令会在这两个字段中插入空格:$ awk -F":" '{ print $1 " " $3 }' /etc/passwd

以这种方式调用 print 时,它将连接 $1、" " 和 $3,创建可读的输出。还可以插入一些文本标签:$ awk -F":" '{ print "username: " $1 "ttuid:" $3" }' /etc/passwd

这将产生以下输出:username: halt uid:7username: operator uid:username: root uid:0username: shutdown uid:6username: sync uid:5username: bin uid:1....etc.

3、调用外部脚本将脚本作为命令行自变量传递给awk对于小的单行程序来说很简单。而对于多行程序,则可以在外部文件中撰写脚本,然后向awk传递-f选项,以向它提供外部脚本文件的调用:$ awk -f myscript.awk myfile.in

将脚本放入文本文件还可以使用附加awk功能。例如:BEGIN { FS=":"}{ print $1 }打印出 /etc/passwd 中每一行的第一个字段

在这个脚本中,字段分隔符在代码自身中指定(通过设置 FS 变量)。在脚本自身中设置字段分隔符,可以少输入一个命令行自变量。

4、begin和end块

BEGIN 和 END 块通常,对于每个输入行,awk 都会执行每个脚本代码块一次。然而,可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码。对于这种情况,awk 允许您定义一个 BEGIN 块。我们在前一个示例中使用了 BEGIN 块。因为 awk 在开始处理输入文件之前会执行 BEGIN 块,因此它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。

awk 还提供了另一个特殊块,叫作 END 块。awk 在处理了输入文件中的所有行之后执行这个块。通常,END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。

5、正则表达式awk 允许使用正则表达式,根据正则表达式是否匹配当前行来选择执行独立代码块。输出包含字符序列foo的行:/foo/ { print }

复杂点的,只打印包含浮点数的行:/[0-9]+.[0-9]*/ { print }

可以将任意一种布尔表达式放在一个代码块之前,以控制何时执行某特定块。仅当对前面的布尔表达式求值为真时,awk 才执行代码块。以下示例脚本输出将输出其第一个字段等于 fred 的所有行中的第三个字段。如果当前行的第一个字段不等于 fred,awk 将继续处理文件而不对当前行执行 print 语句:$1 == "fred" { print $3 }

awk 提供了完整的比较运算符集合,包括 "=="、"<"、">"、"<="、">=" 和 "!="。另外,awk 还提供了 "~" 和 "!~" 运算符,它们分别表示“匹配”和“不匹配”。它们的用法是在运算符左边指定变量,在右边指定正则表达式。如果某一行的第五个字段包含字符序列 root,以下示例只打印这一行中的第三个字段:$5 ~ /root/ { print $3 }

6、条件语句awk 还提供了非常好的类似于 C 语言的 if 语句。if 语句示例:{ if ( $5 ~ /root/ ) { print $3 }}对每一个输入行执行代码块,使用 if 语句来选择执行 print 命令。更复杂的 awk if 语句示例。{ if ( $1 == "foo" ) { if ( $2 == "foo" ) { print "uno" } else { print "one" } } else if ($1 == "bar" ) { print "two" } else { print "three" }}

使用 if 语句还可以将代码:! /matchme/ { print $1 $3 $4 }转换成:{ if ( $0 !~ /matchme/ ) { print $1 $3 $4 }}这两个脚本都只输出不包含 matchme 字符序列的那些行。

awk 还允许使用布尔运算符 "||"(逻辑与)和 "&&"(逻辑或),以便创建更复杂的布尔表达式:( $1 == "foo" ) && ( $2 == "bar" ) { print } 这个示例只打印第一个字段等于 foo 且第二个字段等于 bar 的行。

7、变量awk的变量,数值变量与字符串变量。

数值变量至今,我们不是打印字符串、整行就是特定字段。然而,awk还可以执行整数和浮点运算。使用数学表达式,可以很方便地编写计算文件中空白行数量的脚本。BEGIN { x=0 }/^$/ { x=x+1 }END { print "I found " x " blank lines. :}" }在 BEGIN 块中,将整数变量 x 初始化成零。然后,awk 每次遇到空白行时,awk 将执行 x=x+1 语句,递增 x。处理完所有行之后,执行 END 块,awk 将打印出最终摘要,指出它找到的空白行数量。

字符串化变量awk 的优点之一就是“简单和字符串化”。我认为 awk 变量“字符串化”是因为所有 awk 变量在内部都是按字符串形式存储的。同时,awk 变量是“简单的”,因为可以对它执行数学操作,且只要变量包含有效数字字符串,awk 会自动处理字符串到数字的转换步骤。要理解我的观点,请研究以下示例:x="1."# We just set x to contain the *string* "1."x=x+1# We just added one to a *string* print x# Incidentally, these are comments :)awk 将输出:2.

虽然将字符串值 1. 赋值给变量 x,仍然可以对它加一。但在 bash 和 python 中却不能这样做。首先,bash 不支持浮点运算。而且,如果 bash 有“字符串化”变量,它们并不“简单”;要执行任何数学操作,bash 要求我们将数字放到丑陋的 $( ) ) 结构中。如果使用 python,则必须在对 1. 字符串执行任何数学运算之前,将它转换成浮点值。虽然这并不困难,但它仍是附加的步骤。如果使用 awk,它是全自动的,而那会使我们的代码又好又整洁。如果想要对每个输入行的第一个字段乘方并加一,可以使用以下脚本:{ print ($1^2)+1 }

如果做一个小实验,就可以发现如果某个特定变量不包含有效数字,awk 在对数学表达式求值时会将该变量当作数字零处理。

8、运算符awk 有完整的数学运算符集合。除了标准的加、减、乘、除,awk 还允许使用前面演示过的指数运算符 "^"、模(余数)运算符 "%" 和其它许多从 C 语言中借入的易于使用的赋值操作符。

这些运算符包括前后加减(i++、--foo)、加/减/乘/除赋值运算符( a+=3、b*=2、c/=2.2、d-=6.2)。不仅如此 -- 我们还有易于使用的模/指数赋值运算符(a^=2、b%=4)。

字段分隔符awk 有它自己的特殊变量集合。其中一些允许调整 awk 的运行方式,而其它变量可以被读取以收集关于输入的有用信息。我们已经接触过这些特殊变量中的一个,FS。前面已经提到过,这个变量让您可以设置 awk 要查找的字段之间的字符序列。我们使用 /etc/passwd 作为输入时,将 FS 设置成 ":"。当这样做有问题时,我们还可以更灵活地使用 FS。

FS 值并没有被限制为单一字符;可以通过指定任意长度的字符模式,将它设置成规则表达式。如果正在处理由一个或多个 tab 分隔的字段,您可能希望按以下方式设置 FS:FS="t+"

以上示例中,我们使用特殊 "+" 规则表达式字符,它表示“一个或多个前一字符”。

如果字段由空格分隔(一个或多个空格或 tab),您可能想要将 FS 设置成以下规则表达式:FS="[[:space:]+]"

这个赋值表达式也有问题,它并非必要。为什么?因为缺省情况下,FS 设置成单一空格字符,awk 将这解释成表示“一个或多个空格或 tab”。在这个特殊示例中,缺省 FS 设置恰恰是您最想要的!

复杂的规则表达式也不成问题。即使您的记录由单词 "foo" 分隔,后面跟着三个数字,以下规则表达式仍允许对数据进行正确的分析:

FS="foo[0-9][0-9][0-9]"

字段数量接着我们要讨论的两个变量通常并不是需要赋值的,而是用来读取以获取关于输入的有用信息。第一个是 NF 变量,也叫做“字段数量”变量。awk 会自动将该变量设置成当前记录中的字段数量。可以使用 NF 变量来只显示某些输入行:NF == 3 { print "this particular record has three fields: " $0 }当然,也可以在条件语句中使用 NF 变量,如下:{ if ( NF > 2 ) { print $1 " " $2 ":" $3 }}

9、处理记录记录号记录号 (NR) 是另一个方便的变量。它始终包含当前记录的编号(awk 将第一个记录算作记录号 1)。迄今为止,我们已经处理了每一行包含一个记录的输入文件。对于这些情况,NR 还会告诉您当前行号。然而,当我们在本系列以后部分中开始处理多行记录时,就不会再有这种情况,所以要注意!可以象使用 NF 变量一样使用 NR 来只打印某些输入行:(NR < ) || (NR > ) { print "We are on record number 1-9 or +" }另一个示例:{ #skip header if (NR>) { print "ok, now for the real information!" }

}

awk 提供了适合各种用途的附加变量。我们将在以后的文章中讨论这些变量。

多行记录awk 是一种用于读取和处理结构化数据(如系统的 /etc/passwd 文件)的极佳工具。/etc/passwd 是 UNIX 用户数据库,并且是用冒号定界的文本文件,它包含许多重要信息,包括所有现有用户帐户和用户标识,以及其它信息。在我的前一篇文章中,我演示了 awk 如何轻松地分析这个文件。我们只须将 FS(字段分隔符)变量设置成 ":"。

正确设置了 FS 变量之后,就可以将 awk 配置成分析几乎任何类型的结构化数据,只要这些数据是每行一个记录。然而,如果要分析占据多行的记录,仅仅依靠设置 FS 是不够的。在这些情况下,我们还需要修改 RS 记录分隔符变量。RS 变量告诉 awk 当前记录什么时候结束,新记录什么时候开始。

譬如,让我们讨论一下如何完成处理“联邦证人保护计划”所涉及人员的地址列表的任务: Jimmy the Weasel Pleasant DriveSan Francisco, CA Big Tony Incognito Ave.Suburbia, WA

理论上,我们希望 awk 将每 3 行看作是一个独立的记录,而不是三个独立的记录。如果 awk 将地址的第一行看作是第一个字段 ($1),街道地址看作是第二个字段 ($2),城市、州和邮政编码看作是第三个字段 $3,那么这个代码就会变得很简单。代码如下: BEGIN { FS="n" RS=""}

在上面这段代码中,将 FS 设置成 "n" 告诉 awk 每个字段都占据一行。通过将 RS 设置成 "",还会告诉 awk 每个地址记录都由空白行分隔。一旦 awk 知道是如何格式化输入的,它就可以为我们执行所有分析工作,脚本的其余部分很简单。让我们研究一个完整的脚本,它将分析这个地址列表,并将每个记录打印在一行上,用逗号分隔每个字段。address.awk BEGIN { FS="n" RS=""}{ print $1 ", " $2 ", " $3}

将脚本保存为 address.awk,地址数据存储在文件 address.txt 中,可以通过输入 "awk -f address.awk address.txt" 执行此脚本。输出如下: Jimmy the Weasel, Pleasant Drive, San Francisco, CA Big Tony, Incognito Ave., Suburbia, WA

OFS 和 ORS在 address.awk 的 print 语句中,可以看到 awk 会连接(合并)一行中彼此相邻的字符串。我们使用此功能在同一行上的三个字段之间插入一个逗号和空格 (", ")。这个方法虽然有用,但比较难看。与其在字段间插入 ", " 字符串,倒不如让通过设置一个特殊 awk 变量 OFS,让 awk 完成这件事。print "Hello", "there", "Jim!"

这行代码中的逗号并不是实际文字字符串的一部分。事实上,它们告诉 awk "Hello"、"there" 和 "Jim!" 是单独的字段,并且应该在每个字符串之间打印 OFS 变量。缺省情况下,awk 产生以下输出: Hello there Jim!

这是缺省情况下的输出结果,OFS 被设置成 " ",单个空格。不过,我们可以方便地重新定义 OFS,这样 awk 将插入我们中意的字段分隔符。以下是原始 address.awk 程序的修订版,它使用 OFS 来输出那些中间的 ", " 字符串:

address.awk 的修订版 BEGIN { FS="n" RS="" OFS=", "}{ print $1, $2, $3} awk 还有一个特殊变量 ORS,全称是“输出记录分隔符”。通过设置缺省为换行 ("n") 的 OFS,我们可以控制在 print 语句结尾自动打印的字符。缺省 ORS 值会使 awk 在新行中输出每个新的 print 语句。如果想使输出的间隔翻倍,可以将 ORS 设置成 "nn"。或者,如果想要用单个空格分隔记录(而不换行),将 ORS 设置成 " "。

将多行转换成用 tab 分隔的格式假设我们编写了一个脚本,它将地址列表转换成每个记录一行,且用 tab 定界的格式,以便导入电子表格。使用稍加修改的 address.awk 之后,就可以清楚地看到这个程序只适合于三行的地址。如果 awk 遇到以下地址,将丢掉第四行,并且不打印该行:Cousin VinnieVinnie's Auto Shop City AlleySosueme, OR

要处理这种情况,代码最好考虑每个字段的记录数量,并依次打印每个记录。现在,代码只打印地址的前三个字段。以下就是我们想要的一些代码:

适合具有任意多字段的地址的 address.awk 版本BEGIN { FS="n" RS="" ORS=""} { x=1 while ( x<NF ) { print $x "t" x++ } print $NF "n" }

首先,将字段分隔符 FS 设置成 "n",将记录分隔符 RS 设置成 "",这样 awk 可以象以前一样正确分析多行地址。然后,将输出记录分隔符 ORS 设置成 "",它将使 print 语句在每个调用结尾不输出新行。这意味着如果希望任何文本从新的一行开始,那么需要明确写入 print "n"。

在主代码块中,创建了一个变量 x 来存储正在处理的当前字段的编号。起初,它被设置成 1。然后,我们使用 while 循环(一种 awk 循环结构,等同于 C 语言中的 while 循环),对于所有记录(最后一个记录除外)重复打印记录和 tab 字符。最后,打印最后一个记录和换行;此外,由于将 ORS 设置成 "",print 将不输出换行。程序输出如下,这正是我们所期望的(不算漂亮,但用 tab 定界,以便于导入电子表格):Jimmy the Weasel Pleasant Drive San Francisco, CA Big Tony Incognito Ave. Suburbia, WA Cousin Vinnie Vinnie's Auto Shop City Alley Sosueme, OR

推荐整理分享awk基础知识小结第1/2页(awk入门),希望有所帮助,仅作参考,欢迎阅读内容。

awk基础知识小结第1/2页(awk入门)

文章相关热门搜索词:awk-v,awk提供了哪些功能?,awk基本用法,awk基本用法,awk 语法,awk 语法,awk 原理,awk-v,内容如对您有帮助,希望把文章链接给更多的朋友!

ssh,scp自动登陆的实现方法 示例:A为本地主机(即用于控制其他主机的机器);B为远程主机(即被控制的机器Server),假如ip为...;A和B的系统都是Linux在A上运行命令:#ssh-keygen-trsa(

ssh自动登录的4种实现方法 1.自动ssh/scp方法A为本地主机(即用于控制其他主机的机器);B为远程主机(即被控制的机器Server),假如ip为...;A和B的系统都是Linux在A上运行命令:#ssh-ke

ssh(ssh-keygen)配置免输入密码登录远程主机的方法 环境:本地主机:haeth0:..1.//对外IP地址远程主机:haeth0:..1.//对外IP地址本地主机ha配置:[root@ha/]#cd/etc/ssh[root@hassh]#ssh-keygen-trsa-N""(

标签: awk入门

本文链接地址:https://www.jiuchutong.com/biancheng/376782.html 转载请保留说明!

上一篇:shell编程基础知识小结(shell编程简单实例)

下一篇:ssh,scp自动登陆的实现方法

  • 企业当期的所得税费用
  • 偷税漏税逃税是什么意思
  • 小规模租金可以按1%
  • 金税盘开具发票 在增值税申报表哪填写
  • 增值税一般纳税人证明怎么查询
  • 董事费监事费个税计算
  • 卖二手车发票如何做账?
  • 多付车款退回怎么做账
  • 取消国税用什么手续
  • 私人转公账可以开发票吗
  • 总分机构如何做账
  • 销售赠品怎么入账
  • 电梯按几年摊销
  • 银行呆帐坏账
  • 固定资产报废账目
  • linux转换windows
  • 以土地使用权出资入股未办过户能否抽回
  • 发票金额大于报销金额可以吗
  • 如何解决windows7台试电脑蓝屏问题
  • win10版本激活码
  • word的拼写检查总是变成法语
  • PHP:Memcached::fetchAll()的用法_Memcached类
  • php发送邮件代码
  • 工程完工后的质保金怎么入账
  • 在代开发票时已经预缴个人所得税了,怎么处理?
  • 企业所得税的计提和缴纳分录
  • python输入三个数判断能否构成三角形
  • 增值税进项税额能不能抵扣
  • 自产产品对外赠送的会计处理方法
  • 支付工资会计
  • 企业所得税申报更正怎么操作
  • 物流公司账务处理特点
  • 公司代垫款如何记账
  • 生产车间发生的固定资产租赁费用属于直接费用
  • 股票股利怎么理解
  • access数据库丢失原因
  • 残疾人开公司要交税吗
  • 母子公司关联交易规定
  • 2021个税新规工资表公式
  • 财务挂账应该怎么做账
  • 销售净利率指标的计算是净利润与资产平均余额的比值
  • 融资租赁业务如何开展
  • 应收账款坏账计入资产减值损失还是信用减值损失
  • 向银行借的款属于什么会计要素
  • 固定资产的处置方式包括
  • 营改增税法
  • 未结转本年利润的股东分红的分录
  • 申请享受免税资金的条件
  • 原材料暂估入库成本结转处理
  • 五险一金的正确说法
  • sql事务处理
  • ubuntu中怎么安装vscode
  • bios设置光盘启动图解
  • win10系统怎么将桌面路径改为d盘
  • ubuntu wine安装的软件怎么运行
  • mac电脑虚拟机怎么安装
  • 如何调整心态和正确处理情绪
  • windows xp 开机
  • 苹果Mac系统怎么切换输入法
  • 苹果公司joz
  • awk中执行命令
  • centos开启后一直黑屏
  • 解决linux下set_loginuid failed opening loginuid报错问题
  • win8.1无线网
  • win10系统右键菜单管理
  • Win7旗舰版64位如何关闭电脑触摸屏功能的方法
  • win10怎么快一点
  • 微软kudo
  • 在vs中搭建opengl环境
  • 使用css的三种方式
  • python常见算法
  • node解决跨域
  • #vr#
  • Unity3D游戏开发(第2版)pdf
  • Python制作钟表代码
  • jquery iframe写入内容
  • javascript入门基础
  • 辽宁新农合怎么停保
  • 坚持问题导向的前提是
  • 河北省餐饮经营单位安全生产规定
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设