AWK:Linux 管理员的智能工具包 转自:http://blog.csdn.net/jinyonghe/article/details/1751378
http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html
作者 Emmett Dulaney
您正在学习 Linux 吗?本文对于非常有用的 AWK 文本操作工具进行了介绍,非常有价值。
AWK 实用工具带有其自己的自包含语言,它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母)的最大功能取决于一个人所拥有的知识。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报 表,还有无数其他的功能。
AWK 是什么?
最简单地说,AWK 是一种用于处理文本的编程语言工具。AWK 实用工具的语言在很多方面类似于 shell 编程语言,尽管 AWK 具有完全属于其本身的语法。在最初创造 AWK 时,其目的是用于文本处理,并且这种语言的基础是,只要在输入数据中有模式匹配,就执行一系列指令。该实用工具扫描文件中的每一行,查找与命令行中所给定 内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。
尽管操作可能会很复杂,但命令的语法始终是:
awk '{pattern + action}' {filenames} 其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号 ({}) 不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。
了解字段
实用工具将每个输入行分为记录和字段。记录是单行的输入,而每条记录包含若干字段。默认的字段分隔符是空格或制表符,而记录的分隔符是换行。虽然在默认情况下将制表符和空格都看作字段分隔符(多个空格仍然作为一个分隔符),但是可以将分隔符从空格改为任何其它字符。
为了进行演示,请查看以下保存为 emp_names 的员工列表文件:
46012 DULANEY EVAN MOBILE AL46013 DURHAM JEFF MOBILE AL46015 STEEN BILL MOBILE AL46017 FELDMAN EVAN MOBILE AL46018 SWIM STEVE UNKNOWN AL46019 BOGUE ROBERT PHOENIX AZ46021 JUNE MICAH PHOENIX AZ46022 KANE SHERYL UNKNOWN AR46024 WOOD WILLIAM MUNCIE IN46026 FERGUS SARAH MUNCIE IN46027 BUCK SARAH MUNCIE IN46029 TUTTLE BOB MUNCIE IN当 AWK 读取输入内容时,整条记录被分配给变量 $0。每个字段以字段分隔符分开,被分配给变量 $1、$2、$3 等等。一行在本质上可以包含无数个字段,通过字段号来访问每个字段。因此,命令
awk '{print $1,$2,$3,$4,$5}' names将会产生的打印输出是
46012 DULANEY EVAN MOBILE AL46013 DURHAM JEFF MOBILE AL46015 STEEN BILL MOBILE AL46017 FELDMAN EVAN MOBILE AL46018 SWIM STEVE UNKNOWN AL46019 BOGUE ROBERT PHOENIX AZ46021 JUNE MICAH PHOENIX AZ46022 KANE SHERYL UNKNOWN AR46024 WOOD WILLIAM MUNCIE IN46026 FERGUS SARAH MUNCIE IN46027 BUCK SARAH MUNCIE IN46029 TUTTLE BOB MUNCIE IN值得注意的一项重要内容是,AWK 解释由空格分隔的五个字段,但当它打印显示内容时,在每个字段间只有一个空格。利用为每个字段指定了唯一号码的功能,您可以选择只打印特定的字段。例如,只打印每条记录的姓名时,只需选择第二个和第三个字段进行打印:
$ awk '{print $2,$3}' emp_namesDULANEY EVANDURHAM JEFFSTEEN BILLFELDMAN EVANSWIM STEVEBOGUE ROBERTJUNE MICAHKANE SHERYLWOOD WILLIAMFERGUS SARAHBUCK SARAHTUTTLE BOB$您还可以指定按任何顺序打印字段,而无论它们在记录中是如何存在的。因此,只需要显示姓名字段,并且使其顺序颠倒,先显示名字再显示姓氏:
$ awk '{print $3,$2}' emp_namesEVAN DULANEYJEFF DURHAMBILL STEENEVAN FELDMANSTEVE SWIMROBERT BOGUEMICAH JUNESHERYL KANEWILLIAM WOODSARAH FERGUSSARAH BUCKBOB TUTTLE$使用模式
通过包含一个必须匹配的模式,您可以选择只对特定的记录而不是所有的记录进行操作。模式匹配的最简单形式是搜索,其中要匹配的项目被包含在斜线 (/pattern/) 中。例如,只对那些居住在阿拉巴马州的员工执行前面的操作:
$ awk '/AL/ {print $3,$2}' emp_namesEVAN DULANEYJEFF DURHAMBILL STEENEVAN FELDMANSTEVE SWIM$如果您不指定要打印的字段,则会打印整个匹配的条目:
$ awk '/AL/' emp_names46012 DULANEY EVAN MOBILE AL46013 DURHAM JEFF MOBILE AL46015 STEEN BILL MOBILE AL46017 FELDMAN EVAN MOBILE AL46018 SWIM STEVE UNKNOWN AL$对同一数据集的多个命令可以用分号 (;) 分隔开。例如,在一行中打印姓名,而在另一行中打印城市和州名:
$ awk '/AL/ {print $3,$2 ; print $4,$5}' emp_namesEVAN DULANEYMOBILE ALJEFF DURHAMMOBILE ALBILL STEENMOBILE ALEVAN FELDMANMOBILE ALSTEVE SWIMUNKNOWN AL$如果没有使用分号 (print $3,$2,$4,$5),则会在同一行中显示所有内容。另一方面,如果分别给出两个打印语句,则会产生完全不同的结果:
$ awk '/AL/ {print $3,$2} {print $4,$5}' emp_namesEVAN DULANEYMOBILE ALJEFF DURHAMMOBILE ALBILL STEENMOBILE ALEVAN FELDMANMOBILE ALSTEVE SWIMUNKNOWN ALPHOENIX AZPHOENIX AZUNKNOWN ARMUNCIE INMUNCIE INMUNCIE INMUNCIE IN$只有在列表中找到 AL 时才会给出字段三和字段二。但是,字段四和字段五是无条件的,始终打印它们。只有第一组花括号中的命令对前面紧邻的命令 (/AL/) 起作用。
结果非常不便于阅读,可以使其稍微更清晰一些。首先,在城市与州之间插入一个空格和逗号。然后,在每两行显示之后放置一个空行:
$ awk '/AL/ {print $3,$2 ; print $4", "$5"\n"}' emp_namesEVAN DULANEYMOBILE, ALJEFF DURHAMMOBILE, ALBILL STEENMOBILE, ALEVAN FELDMANMOBILE, ALSTEVE SWIMUNKNOWN, AL$在第四和第五个字段之间,添加一个逗号和一个空格(在引号之间),在第五个字段后面,打印一个换行符 (\n)。在 AWK 打印语句中还可以使用那些可在 echo 命令中使用的所有特殊字符,包括:
\n(换行)
\t(制表)
\b(退格)
\f(进纸)
\r(回车)
因此,要读取全部五个最初由制表符分隔开的字段,并且也利用制表符打印它们,您可以编程如下
$ awk '{print $1"\t"$2"\t"$3"\t"$4"\t"$5}' emp_names46012 DULANEY EVAN MOBILE AL46013 DURHAM JEFF MOBILE AL46015 STEEN BILL MOBILE AL46017 FELDMAN EVAN MOBILE AL46018 SWIM STEVE UNKNOWN AL46019 BOGUE ROBERT PHOENIX AZ46021 JUNE MICAH PHOENIX AZ46022 KANE SHERYL UNKNOWN AR46024 WOOD WILLIAM MUNCIE IN46026 FERGUS SARAH MUNCIE IN46027 BUCK SARAH MUNCIE IN46029 TUTTLE BOB MUNCIE IN$通过连续设置多项标准并用管道 (|) 符号将其分隔开,您可以一次搜索多个模式匹配:
$ awk '/AL|IN/' emp_names46012 DULANEY EVAN MOBILE AL46013 DURHAM JEFF MOBILE AL46015 STEEN BILL MOBILE AL46017 FELDMAN EVAN MOBILE AL46018 SWIM STEVE UNKNOWN AL46024 WOOD WILLIAM MUNCIE IN46026 FERGUS SARAH MUNCIE IN46027 BUCK SARAH MUNCIE IN46029 TUTTLE BOB MUNCIE IN$这样可找到每个阿拉巴马州和印第安那州居民的匹配记录。但是在试图找出居住在亚利桑那州的人时,出现了一个问题:
$ awk '/AR/' emp_names46019 BOGUE ROBERT PHOENIX AZ46021 JUNE MICAH PHOENIX AZ46022 KANE SHERYL UNKNOWN AZ46026 FERGUS SARAH MUNCIE IN46027 BUCK SARAH MUNCIE IN$员工 46026 和 46027 没有住在亚利桑那州;但是他们的名字中包含所搜索的字符序列。切记,当在 AWK 中进行模式匹配时,例如 grep、sed 或者大部分其他 Linux/Unix 命令,将在记录(行)中的任何位置查找匹配,除非指定进行其他操作。为解决这一问题,必须将搜索与特定字段联系起来。通过利用代字号 (˜) 以及对特定字段的说明,可以达到这一目的,如下例所示:
$ awk '$5 ˜ /AR/' emp_names46019 BOGUE ROBERT PHOENIX AZ46021 JUNE MICAH PHOENIX AZ46022 KANE SHERYL UNKNOWN AZ$代字号(表示匹配)的对应符号是一个前面带有感叹号的代字号 (!˜)。这些字符通知程序,如果搜索序列没有出现在指定字段中,则找出与搜索序列相匹配的所有行:
$ awk '$5 !˜ /AR/' names46012 DULANEY EVAN MOBILE AL46013 DURHAM JEFF MOBILE AL46015 STEEN BILL MOBILE AL46017 FELDMAN EVAN MOBILE AL46018 SWIM STEVE UNKNOWN AL46024 WOOD WILLIAM MUNCIE IN46026 FERGUS SARAH MUNCIE IN46027 BUCK SARAH MUNCIE IN46029 TUTTLE BOB MUNCIE IN$在这种情况下,将显示第五个字段中没有 AR 的所有行 — 包括两个 Sarah 条目,这两个条目确实包含 AR,但却是在第三个字段而不是第五个字段中。
花括号和字段分隔符
括号字符在 AWK 命令中起着很重要的作用。出现在括号之间的操作指出将要发生什么以及何时发生。当只使用一对括号时:
{print $3,$2}括号间的所有操作同时发生。当使用多于一对的括号时:
{print $3}{print $2}执行第一组命令,在该命令完成后执行第二组命令。注意以下两列清单的区别:
$ awk '{print $3,$2}' namesEVAN DULANEYJEFF DURHAMBILL STEENEVAN FELDMANSTEVE SWIMROBERT BOGUEMICAH JUNESHERYL KANEWILLIAM WOODSARAH FERGUSSARAH BUCKBOB TUTTLE$$ awk '{print $3}{print $2}' namesEVANDULANEYJEFFDURHAMBILLSTEENEVANFELDMANSTEVESWIMROBERTBOGUEMICAHJUNESHERYLKANEWILLIAMWOODSARAHFERGUSSARAHBUCKBOBTUTTLE$要利用多组括号进行重复查找,执行第一组中的命令直到完成为止;然后处理第二组命令。如果有第三组命令, 则在第二组命令完成后执行它,以此类推。在所生成的打印输出中,有两个分隔的打印命令,因此先执行第一个命令,随后执行第二个命令,这样导致每个条目显示 在两行而不是一行中。
区分两个字段的字段分隔符不一定始终是空格;它可以是任何可识别的字符。为进行演示,假定 emp_names 文件利用冒号而不是制表符来分隔字段:
$ cat emp_names46012:DULANEY:EVAN:MOBILE:AL46013:DURHAM:JEFF:MOBILE:AL46015:STEEN:BILL:MOBILE:AL46017:FELDMAN:EVAN:MOBILE:AL46018:SWIM:STEVE:UNKNOWN:AL46019:BOGUE:ROBERT:PHOENIX:AZ46021:JUNE:MICAH:PHOENIX:AZ46022:KANE:SHERYL:UNKNOWN:AR46024:WOOD:WILLIAM:MUNCIE:IN46026:FERGUS:SARAH:MUNCIE:IN46027:BUCK:SARAH:MUNCIE:IN46029:TUTTLE:BOB:MUNCIE:IN$如果试图通过指定所需要的第二个字段来打印姓氏
$ awk '{print $2}' emp_names您最后会得到十二个空行。因为文件中没有空格,除了第一个字段之外没有可认别的字段。为解决这一问题,必须通知 AWK 是空格之外的另一个字符作为分隔符,有两种方法可通知 AWK 使用新的字段分隔符:使用命令行参数 -F,或在程序中指定变量 FS。两种方法的效果相同,只有一种例外情况,如下例所示:
$ awk '{FS=":"}{print $2}' emp_namesDURHAMSTEENFELDMANSWIMBOGUEJUNEKANEWOODFERGUSBUCKTUTTLE$$ awk -F: '{print $2}' emp_namesDULANEYDURHAMSTEENFELDMANSWIMBOGUEJUNEKANEWOODFERGUSBUCKTUTTLE$在第一个命令中,头一条记录返回不正确的空行,而其他结果正确。直到读取第二条记录时,才识别字段分隔符并正确地执行。通过使用 BEGIN 语句可以纠正这一缺点(在后文详述)。-F 的功能非常类似于 BEGIN,能够正确地读取第一条记录并按要求执行。
在本文开始处我曾提到,默认的显示/输出字段分隔符是空格。通过使用输出字段分隔符 (OFS) 变量,可以在程序中更改此特性。例如,要读取文件(由冒号分隔)并以短划线显示,则命令是
$ awk -F":" '{OFS="-"}{print $1,$2,$3,$4,$5}' emp_names46012-DULANEY-EVAN-MOBILE-AL46013-DURHAM-JEFF-MOBILE-AL46015-STEEN-BILL-MOBILE-AL46017-FELDMAN-EVAN-MOBILE-AL46018-SWIM-STEVE-UNKNOWN-AL46019-BOGUE-ROBERT-PHOENIX-AZ46021-JUNE-MICAH-PHOENIX-AZ46022-KANE-SHERYL-UNKNOWN-AR46024-WOOD-WILLIAM-MUNCIE-IN46026-FERGUS-SARAH-MUNCIE-IN46027-BUCK-SARAH-MUNCIE-IN46029-TUTTLE-BOB-MUNCIE-IN$FS 和 OFS 是(输入)字段分隔符和输出字段分隔符,它们只是一对可以在 AWK 实用工具中使用的变量。例如,要在打印时为每行编号,可以采用以下方式使用 NR 变量:
$ awk -F":" '{print NR,$1,$2,$3}' emp_names1 46012 DULANEY EVAN2 46013 DURHAM JEFF3 46015 STEEN BILL4 46017 FELDMAN EVAN5 46018 SWIM STEVE6 46019 BOGUE ROBERT7 46021 JUNE MICAH8 46022 KANE SHERYL9 46024 WOOD WILLIAM10 46026 FERGUS SARAH11 46027 BUCK SARAH12 46029 TUTTLE BOB$找出员工号码处于 46012 和 46015 之间的所有行:
$ awk -F":" '/4601[2-5]/' emp_names46012 DULANEY EVAN MOBILE AL46013 DURHAM JEFF MOBILE AL46015 STEEN BILL MOBILE AL$添加文本
可以按照添加控制序列或其他字符的相同方式将文本添加到显示中。例如,要将分隔符从空格改为冒号,则命令是
awk '{print $1":"$2":"$3":"$4":"$5}' emp_names > new_emp_names在这种情况下,字符 (:) 包含在引号 ("/") 中,它被添加到每个字段之间。在引号之间的值可以是任何内容。例如,创建一个关于居住在阿拉巴马州的员工的外观类似数据库的显示:
$ awk '$5 ~ /AL/ {print "NAME: "$2", "$3"\nCITY-STATE: "$4", "$5"\n"}' emp_namesNAME: DULANEY, EVANCITY-STATE: MOBILE, ALNAME: DURHAM, JEFFCITY-STATE: MOBILE, ALNAME: STEEN, BILLCITY-STATE: MOBILE, ALNAME: FELDMAN, EVANCITY-STATE: MOBILE, ALNAME: SWIM, STEVECITY-STATE: UNKNOWN, AL$数学操作
AWK 除了提供文本功能,还提供全部范围的算术操作符,包括以下符号:
+ 将数字相加
- 减
* 乘
/ 除
^ 执行指数运算
% 提供模
++ 将变量值加一
+= 将其他操作的结果分配给变量
— 将变量减一
-= 将减法操作的结果分配给变量
*= 分配乘法操作的结果
/= 分配除法操作的结果
%= 分配求模操作的结果
例如,假定您的机器上存在以下的文件,详细地列出硬件商店中的物品:
$ cat inventoryhammers 5 7.99drills 2 29.99punches 7 3.59drifts 2 4.09bits 55 1.19saws 123 14.99nails 800 .19screws 80 .29brads 100 .24$第一项业务定单是通过将第二个字段(数量)的值乘以第三个字段(价格)的值,计算每种物品的库存价值:
$ awk '{print $1,"QTY: "$2,"PRICE: "$3,"TOTAL: "$2*$3}' inventoryhammers QTY: 5 PRICE: 7.99 TOTAL: 39.95drills QTY: 2 PRICE: 29.99 TOTAL: 59.98punches QTY: 7 PRICE: 3.59 TOTAL: 25.13drifts QTY: 2 PRICE: 4.09 TOTAL: 8.18bits QTY: 55 PRICE: 1.19 TOTAL: 65.45saws QTY: 123 PRICE: 14.99 TOTAL: 1843.77nails QTY: 800 PRICE: .19 TOTAL: 152screws QTY: 80 PRICE: .29 TOTAL: 23.2brads QTY: 100 PRICE: .24 TOTAL: 24$如果这些行本身并不重要,您只是希望确定商店中有多少件物品,则可以分配一个普通变量,按照每条记录中的物品数量增加:
$ awk '{x=x+$2} {print x}' inventory5714167119499410741174$根据这一数据,商店中有 1174 件物品。第一次执行时,变量 x 没有值,因此它采用第一行第二个字段的值。第二次执行时,它保留了第一行的值并加上第二行的值,以此类推,直到达到累计的总合。
可以应用相同的过程来确定现有库存的总价值:
$ awk '{x=x+($2*$3)} {print x}' inventory39.9599.93125.06133.24198.692042.462194.462217.662241.66$因此,1174 件物品的价值是 $2,241.66。虽然这一过程可以获得总计值,但它的外观很差,需要加工成实际的报表。利用一些附加项,很容易使显示变得更整洁:
$ awk '{x=x+($2*$3)}{print $1,"QTY: "$2,"PRICE: "$3,"TOTAL: "$2*$3,"BAL: "x}' inventoryhammers QTY: 5 PRICE: 7.99 TOTAL: 39.95 BAL: 39.95drills QTY: 2 PRICE: 29.99 TOTAL: 59.98 BAL: 99.93punches QTY: 7 PRICE: 3.59 TOTAL: 25.13 BAL: 125.06drifts QTY: 2 PRICE: 4.09 TOTAL: 8.18 BAL: 133.24bits QTY: 55 PRICE: 1.19 TOTAL: 65.45 BAL: 198.69saws QTY: 123 PRICE: 14.99 TOTAL: 1843.77 BAL: 2042.46nails QTY: 800 PRICE: .19 TOTAL: 152 BAL: 2194.46screws QTY: 80 PRICE: .29 TOTAL: 23.2 BAL: 2217.66brads QTY: 100 PRICE: .24 TOTAL: 24 BAL: 2241.66$该过程提供了每条记录的清单,同时将总价值分配给库存值,并保持商店资产的运作平衡。
BEGIN 和 END
使用 BEGIN 和 END 语句可以分别指定在处理实际开始之前或者完成之后进行操作。BEGIN 语句最常用于建立变量或显示标题。另一方面,END 语句可用于在程序结束后继续进行处理。
在前面的示例中,利用以下例程生成了物品的总价值:
awk '{x=x+($2*$3)} {print x}' inventory该例程在运行总计累加时显示了文件中的每一行。没有其他方法可以指定它,而不让在每一行进行打印也导致它始终不打印出来。但是,利用 END 语句可以避免这一问题:
$ awk '{x=x+($2*$3)} END {print "Total Value of Inventory:"x}' inventoryTotal Value of Inventory: 2241.66$定义了变量 x,它对每一行进行处理;但是,在所有处理完成之前不会生成显示。尽管可以作为独立例程使用,它也可以置入到先前的代码列表,添加更多信息并生成更完整的报表:
$ awk '{x=x+($2*$3)} {print $1,"QTY: "$2,"PRICE: "$3,"TOTAL: "$2*$3} END {print "Total Value of Inventory: " x}' inventoryhammers QTY: 5 PRICE: 7.99 TOTAL: 39.95drills QTY: 2 PRICE: 29.99 TOTAL: 59.98punches QTY: 7 PRICE: 3.59 TOTAL: 25.13drifts QTY: 2 PRICE: 4.09 TOTAL: 8.18bits QTY: 55 PRICE: 1.19 TOTAL: 65.45saws QTY: 123 PRICE: 14.99 TOTAL: 1843.77nails QTY: 800 PRICE: .19 TOTAL: 152screws QTY: 80 PRICE: .29 TOTAL: 23.2brads QTY: 100 PRICE: .24 TOTAL: 24Total Value of Inventory: 2241.66$BEGIN 命令与 END 的工作方式相同,但它建立了那些需要在完成其他工作之前所做的项目。该过程最常见的目的是创建报表的标题。此例程的语法类似于
$ awk 'BEGIN {print "ITEM QUANTITY PRICE TOTAL"}'输入、输出和源文件
AWK 工具可以从文件中读取其输入,正如在此之前所有示例所做的那样,它也可以从其他命令的输出中获取输入。例如:
$ sort emp_names | awk '{print $3,$2}'awk 命令的输入是排序操作的输出。除了 sort,还可以使用任何其他的 Linux 命令 — 例如 grep。该过程允许您在离开所选定字段前对文件执行其他操作。
类似于解释程序,AWK 使用输出改向操作符 > 和 >> 将其输出放入文件中而不是标准输出设备。这些符号的作用类似于它们在解释程序中的对应符号,因此 > 在不存在文件时创建文件,而 >> 追加到现有文件的尾部。请看以下的示例:
$ awk '{print NR, $1 ) > "/tmp/filez" }' emp_names$ cat /tmp/filez1 460122 460133 460154 460175 460186 460197 460218 460229 4602410 4602611 4602712 46029$检查该语句的语法,您会看到输出改向是在打印语句完成后进行的。必须将文件名包含在引号中,否则它只是一 个未初始化的 AWK 变量,而将指令联接起来会在 AWK 中产生错误。(如果不正确地使用改向符号,则 AWK 无法了解该符号意味着“改向”还是一个关系操作符。)
在 AWK 中输出到管道也类似于解释程序中所实现的相同操作。要将打印命令的输出发送到管道中,可以在打印命令后附加管道符号以及命令的名称,如下所示:
$ awk '{ print $2 | "sort" }' emp_namesBOGUEBUCKDULANEYDURHAMFELDMANFERGUSJUNEKANESTEENSWIMTUTTLEWOOD$这是输出改向的情况,必须将命令包含在引号中,而管道的名称是被执行命令的名称。
AWK 所使用的命令可以来自两个地方。首先,可以在命令行中指定它们,如示例中所示。其次,它们可以由源文件提供。如果是这种情况,通过 -f 选项将这种情况向 AWK 发出警告。演示如下:
$ cat awklist{print $3,$2}{print $4,$5,"\n"}$$ awk -f awklist emp_namesEVAN DULANEYMOBILE ALJEFF DURHAMMOBILE ALBILL STEENMOBILE ALEVAN FELDMANMOBILE ALSTEVE SWIMUNKNOWN ALROBERT BOGUEPHOENIX AZMICAH JUNEPHOENIX AZSHERYL KANEUNKNOWN ARWILLIAM WOODMUNCIE INSARAH FERGUSMUNCIE INSARAH BUCKMUNCIE INBOB TUTTLEMUNCIE IN$注意,在源文件中的任何地方或者在命令行中调用它时,不使用单引号。单引号只用于区别命令行中的命令与文件名称。
如果简单的输出不能处理您的程序中所需要的复杂信息,则可以尝试由 printf 命令获得的更加复杂的输出,其语法是
printf( format, value, value ...)该语法类似于 C 语言中的 printf 命令,而格式的规格是相同的。通过插入一项定义如何打印数值的规格,可以定义该格式。格式规格包含一个跟有字母的 %。类似于打印命令,printf 不必包含在圆括号中,但是可以认为使用圆括号是一种良好的习惯。
下表列出 printf 命令提供的各种规格。
规格 说明
%c 打印单个 ASCII 字符
%d 打印十进制数
%e 打印数字的科学计数表示
%f 打印浮点表示
%g 打印 %e 或 %f;两种方式都更简短
%o 打印无符号的八进制数
s 打印 ASCII 字符串
%x 打印无符号的十六进制数
%% 打印百分号;不执行转换
可以在 % 与字符之间提供某些附加的格式化参数。这些参数进一步改进数值的打印方式:
参数 说明
- 将字段中的表达式向左对齐
,width 根据需要将字段补齐到指定宽度(前导零使用零将字段补齐)
.prec 小数点右面数字的最大字符串宽度或最大数量
printf 命令能够控制并将数值从一种格式转换为另一种格式。当需要打印变量的值时,只需提供一种规格,指示 printf 如何打印信息(通常包含在双引号中)即可。必须为每个传递到 printf 的变量包含一个规格参数;如果包含过少的参数,则 printf 不会打印所有的数值。
处理错误
AWK 工具报告所发生错误的方式很令人恼火。一个错误会阻碍任何操作的进行,所提供的错误信息非常含混不清:
awk: syntax error near line 2awk: bailing out near line 2您可能会花几小时的时间查看第 2 行,试图找出它为什么阻碍程序运行;这就是支持使用源文件的一个有力论据。
切记有两条规则可以帮助您避免出现语法错误:
1. 确保命令位于括号中,而括号位于单引号中。没有使用这些字符之一必然导致程序无法运行。
2. 搜索命令需要位于斜线之间。要找出住在印第安那州的员工,您必须使用“/IN/”而不是“IN”。
结论
尽管 AWK 完全代表另外的含意,但它应该是管理员智能工具包的首字母缩写。连同 SED 一起,AWK 实用工具是 Linux 管理员所拥有的功能最强大和灵活的工具之一。通过了解其语言的一些特性,您可以开辟出能够简化任务的领域,否则这些任务将会是非常费时和困难的。
相关推荐
在IT领域,Linux/Unix操作系统提供了许多强大的命令行工具,其中AWK是处理文本数据的神器。本篇文章将深入探讨AWK的详细用法,...所以,不妨深入探索这个强大的文本处理工具,让AWK成为你的技能库中不可或缺的一部分。
结合实际工作场景,不断实践和探索这两个工具的潜力,是成为Linux高手的重要步骤。 在阅读本书时,读者可能会遇到一些挑战,比如理解正则表达式、掌握awk的编程逻辑等。不过,随着对这两个工具的深入学习,你会发现...
5. **命令行操作**:掌握基本的Linux命令,如ls、cd、mkdir、rm、cp、mv等,以及更高级的命令如grep、sed、awk、find等,这些都是进行系统管理和脚本编写的基础。 6. **编程与开发**:树莓派支持Python、C++、Java...
在众多文本处理工具中,awk和sed以其强大和灵活的能力著称,成为Linux shell编程中的两大“神器”。本文将深入探讨awk和sed的使用方法及其在shell编程中的应用,揭示如何巧妙结合这两个工具以实现复杂的文本处理功能...
AWK是Linux环境下强大的文本分析工具,它能够方便地处理和解析文件中的数据。本手册旨在为初学者提供一个简明易懂的学习路径,帮助理解AWK的基本概念和常用操作。 **1. AWK的基本结构** AWK的工作方式是以行为单位...
- **gawk**:GNU awk 的简称,广泛应用于 Linux 系统中,具有很强的功能性和灵活性。 对于 Solaris 操作系统而言,推荐使用 **nawk**,因为它相比旧版的 awk 增加了许多重要的功能,如支持数学运算中的幂运算 `^`、...
AWK是一种强大的文本分析工具,尤其在处理结构化数据时,它的灵活性和高效性使其成为Unix/Linux环境中的得力助手。这个文档将深入讲解AWK的基本概念、语法以及实际应用。 ### 1. **AWK基础知识** AWK基于行处理,...
awk是一种强大的文本分析工具,常用于处理Linux或Unix系统中的结构化数据文件。它通过模式匹配和动作执行来解析和操作文本,对于日志分析、数据提取和转换等任务非常高效。在shell环境中,awk是程序员和系统管理员的...
### awk使用大全:深入探索Linux下的数据处理利器 在Linux环境下,awk是一个极其强大的文本处理工具,它能够灵活地解析和操作数据,尤其擅长于处理结构化的文本文件。本文将全面解析awk的基本用法、核心功能及实际...
本文将深入探讨两个强大的文本处理工具——`sed`和`awk`,它们经常被用于Shell脚本中,以实现对文本文件的高效处理。`sed`(流编辑器)和`awk`(一种编程语言)都是数据分析和文本转换的强大工具,尤其在处理日志...
### Linux命令大全搜索工具知识...《Linux命令大全搜索工具》涵盖了广泛的Linux命令,不仅适合初学者学习基本操作,也适用于高级用户深入探索系统管理技巧。通过掌握这些命令,用户可以更加高效地管理和使用Linux系统。
Linux Shell脚本是一种编程语言,它运行在Linux操作系统上,用于控制和自动化系统管理任务。...通过本书的学习,读者能够更加深入地了解Bash、Sed、Awk等工具的使用和原理,从而更好地管理和优化Linux系统。
【AWK试用手册,AWK入门基础】 AWK是一种强大的文本分析工具,适用于处理具有结构化数据格式的文件,尤其在Unix/Linux环境中广泛应用。它以其简洁和高效著称,...不断实践和探索,你会发现AWK是一个强大而有趣的工具。
### AWK技术手册核心知识点详解 ...总之,AWK作为一款功能强大的文本处理工具,其灵活性和易用性使其成为处理各种数据任务的理想选择。无论是初学者还是经验丰富的程序员,都可以从深入学习AWK中获益匪浅。
Linux命令涵盖范围广泛,包括文件和目录管理(如`cd`、`mkdir`、`rm`、`cp`、`mv`)、文本处理(如`grep`、`sed`、`awk`)、进程管理(如`ps`、`kill`、`top`)、网络通信(如`ping`、`curl`、`nc`)以及系统监控...
接下来,我们讨论AWK工具在数据处理中的作用。AWK是一种强大的文本处理工具,尤其适合于处理结构化的文本数据,如NS2的仿真日志。使用AWK,你可以方便地提取、过滤、计算和格式化数据。 3. **AWK处理日志数据**:...
转换后的文本格式使得数据可以进一步通过grep、awk、sed等Linux命令行工具进行过滤、搜索和修改。 “dumphive”的使用方法一般包括以下几个步骤: 1. 获取Windows注册表文件:这可能需要从运行Windows的系统中复制....
在Linux环境中,Plot可以与各种命令行工具和脚本语言(如awk、sed、Python、Perl等)集成,形成强大的数据分析流水线。例如,可以先用这些工具处理原始数据,然后用Plot将处理结果可视化。这样的组合可以极大地提高...
Linux命令大全搜索工具v1.5.1是一款专为Linux用户设计的实用工具,它集成了大量的Linux命令,帮助用户快速查找、理解和学习各种命令的用法,提高工作效率。这款工具通常以PDF文档的形式存在,方便用户离线查阅。下面...
V8刷机包制作工具是针对V8设备的专门用于构建和修改刷机包的工具,主要用于Android系统。由于该工具只能在Linux环境下运行,因此它...对于喜欢探索和自定义手机系统的用户,掌握这类工具的使用方法是提升体验的关键。