【Linux 工具--AWK】

1. awk简介

awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。

awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。gawk是awk的GNU版本,它提供了Bell实验室和GNU的一些扩展。下面介绍的awk是以GUN的gawk为例的,在linux系统中已把awk链接到gawk,所以下面全部以awk进行介绍。

2. awk命令格式和选项

2.1. awk的语法有两种形式

? awk [options] ‘script‘ var=value file(s)

? awk [options] -f scriptfile var=value file(s)

2.2. 命令选项

-F fs or --field-separator fs

指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。

-v var=value or --asign var=value

赋值一个用户定义变量。

-f scripfile or --file scriptfile

从脚本文件中读取awk命令。

-mf nnn and -mr nnn

对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

-W compact or --compat, -W traditional or --traditional

在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。

-W copyleft or --copyleft, -W copyright or --copyright

打印简短的版权信息。

-W help or --help, -W usage or --usage

打印全部awk选项和每个选项的简短说明。

-W lint or --lint

打印不能向传统unix平台移植的结构的警告。

-W lint-old or --lint-old

打印关于不能向传统unix平台移植的结构的警告。

-W posix

打开兼容模式。但有以下限制,不识别:\x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。

-W re-interval or --re-inerval

允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。

-W source program-text or --source program-text

使用program-text作为源代码,可与-f命令混用。

-W version or --version

打印bug报告信息的版本。

3. 模式和操作

awk脚本是由模式和操作组成的:

pattern {action} 如$ awk ‘/root/‘ test,或$ awk ‘$3 < 100‘ test。

两者是可选的,如果没有模式,则action应用到全部记录,如果没有action,则输出匹配全部记录。默认情况下,每一个输入行都是一条记录,但用户可通过RS变量指定不同的分隔符进行分隔。

3.1. 模式

模式可以是以下任意一个:

? /正则表达式/:使用通配符的扩展集。

? 关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符串或数字的比较,如$2>%1选择第二个字段比第一个字段长的行。

? 模式匹配表达式:用运算符~(匹配)和~!(不匹配)。

? 模式,模式:指定一个行的范围。该语法不能包括BEGIN和END模式。

? BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。

? END:让用户在最后一条输入记录被读取之后发生的动作。

3.2. 操作

操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内。主要有四部份:

? 变量或数组赋值

? 输出命令

? 内置函数

? 控制流命令

4. awk的环境变量

Table 1. awk的环境变量


变量


描述


$n


当前记录的第n个字段,字段间由FS分隔。


$0


完整的输入记录。


ARGC


命令行参数的数目。


ARGIND


命令行中当前文件的位置(从0开始算)。


ARGV


包含命令行参数的数组。


CONVFMT


数字转换格式(默认值为%.6g)


ENVIRON


环境变量关联数组。


ERRNO


最后一个系统错误的描述。


FIELDWIDTHS


字段宽度列表(用空格键分隔)。


FILENAME


当前文件名。


FNR


同NR,但相对于当前文件。


FS


字段分隔符(默认是任何空格)。


IGNORECASE


如果为真,则进行忽略大小写的匹配。


NF


当前记录中的字段数。


NR


当前记录数。


OFMT


数字的输出格式(默认值是%.6g)。


OFS


输出字段分隔符(默认值是一个空格)。


ORS


输出记录分隔符(默认值是一个换行符)。


RLENGTH


由match函数所匹配的字符串的长度。


RS


记录分隔符(默认是一个换行符)。


RSTART


由match函数所匹配的字符串的第一个位置。


SUBSEP


数组下标分隔符(默认值是\034)。

5. awk运算符

Table 2. 运算符


运算符


描述


= += -= *= /= %= ^= **=


赋值


?:


C条件表达式


||


逻辑或


&&


逻辑与


~ ~!


匹配正则表达式和不匹配正则表达式


< <= > >= != ==


关系运算符


空格


连接


+ -


加,减


* / &


乘,除与求余


+ - !


一元加,减和逻辑非


^ ***


求幂


++ --


增加或减少,作为前缀或后缀


$


字段引用


in


数组成员

6. 记录和域

6.1. 记录

awk把每一个以换行符结束的行称为一个记录。

记录分隔符:默认的输入和输出的分隔符都是回车,保存在内建变量ORS和RS中。

$0变量:它指的是整条记录。如$ awk ‘{print $0}‘ test将输出test文件中的所有记录。

变量NR:一个计数器,每处理完一条记录,NR的值就增加1。如$ awk ‘{print NR,$0}‘ test将输出test文件中所有记录,并在记录前显示记录号。

6.2.

记录中每个单词称做“域”,默认情况下以空格或tab分隔。awk可跟踪域的个数,并在内建变量NF中保存该值。如$ awk ‘{print $1,$3}‘ test将打印test文件中第一和第三个以空格分开的列(域)。

6.3. 域分隔符

内建变量FS保存输入域分隔符的值,默认是空格或tab。我们可以通过-F命令行选项修改FS的值。如$ awk -F: ‘{print $1,$5}‘ test将打印以冒号为分隔符的第一,第五列的内容。

可以同时使用多个域分隔符,这时应该把分隔符写成放到方括号中,如$awk -F‘[:\t]‘ ‘{print $1,$3}‘ test,表示以空格、冒号和tab作为分隔符。

输出域的分隔符默认是一个空格,保存在OFS中。如$ awk -F: ‘{print $1,$5}‘ test,$1和$5间的逗号就是OFS的值。

7. gawk专用正则表达式元字符

一般通用的元字符集就不讲了,可参考我的Sed和Grep学习笔记。以下几个是gawk专用的,不适合unix版本的awk。


\Y


匹配一个单词开头或者末尾的空字符串。


\B


匹配单词内的空字符串。


\<


匹配一个单词的开头的空字符串,锚定开始。


\>


匹配一个单词的末尾的空字符串,锚定末尾。


\w


匹配一个字母数字组成的单词。


\W


匹配一个非字母数字组成的单词。


\‘


匹配字符串开头的一个空字符串。


\‘


匹配字符串末尾的一个空字符串。

8. POSIX字符集

可参考我的Grep学习笔记

9. 匹配操作符(~)

用来在记录或者域内匹配正则表达式。

如$ awk ‘$1 ~/^root/‘ test将显示test文件第一列中以root开头的行。

10. 比较表达式

conditional expression1 ? expression2: expression3,

例如:

$ awk ‘{max = {$1 > $3} ? $1: $3: print max}‘ test。

如果第一个域大于第三个域,$1就赋值给max,否则$3就赋值给max。

$ awk ‘$1 + $2 < 100‘ test。

如果第一和第二个域相加大于100,则打印这些行。

$ awk ‘$1 > 5 && $2 < 10‘ test,

如果第一个域大于5,并且第二个域小于10,则打印这些行。

11. 范围模板

范围模板匹配从第一个模板的第一次出现到第二个模板的第一次出现之间所有行。如果有一个模板没出现,则匹配到开头或末尾。如$ awk ‘/root/,/mysql/‘ test将显示root第一次出现到mysql第一次出现之间的所有行。

12. 一个验证passwd文件有效性的例子

$ cat /etc/passwd | awk -F: ‘\

NF != 7{\

printf("line %d,does not have 7 fields:%s\n",NR,$0)}\

$1 !~ /[A-Za-z0-9]/{printf("line %d,non alpha and numeric user id:%d: %s\n,NR,$0)}\

$2 == "*" {printf("line %d, no password: %s\n",NR,$0)}‘

cat把结果输出给awk,awk把域之间的分隔符设为冒号。

如果域的数量(NF)不等于7,就执行下面的程序。

printf打印字符串"line ?? does not have 7 fields",并显示该条记录。

如果第一个域没有包含任何字母和数字,printf打印“no alpha and numeric user id" ,并显示记录数和记录。

如果第二个域是一个星号,就打印字符串“no passwd”,紧跟着显示记录数和记录本身。

13. 几个实例

? $ awk ‘{print $3}‘ test-----截取第三域(列)的内容。

? $ awk ‘/^(no|so)/‘ test-----打印所有以模式no或so开头的行。

? $ awk ‘/^[ns]/{print $1}‘ test-----如果记录以n或s开头,就打印这个记录。

? $ awk ‘$1 ~/[0-9][0-9]$/(print $1}‘ test-----如果第一个域以两个数字结束就打印这个记录。

? $ awk ‘$1 == 100 || $2 < 50‘ test-----如果第一个或等于100或者第二个域小于50,则打印该行。

? $ awk ‘$1 != 10‘ test-----如果第一个域不等于10就打印该行。

? $ awk ‘/test/{print $1 + 10}‘ test-----如果记录包含正则表达式test,则第一个域加10并打印出来。

? $ awk ‘{print ($1 > 5 ? "ok "$1: "error"$1)}‘ test-----如果第一个域大于5则打印问号后面的表达式值,否则打印冒号后面的表达式值。

? $ awk ‘/^root/,/^mysql/‘ test----打印以正则表达式root开头的记录到以正则表达式mysql开头的记录范围内的所有记录。如果找到一个新的正则表达式root开头的记录,则继续打印直到下一个以正则表达式mysql开头的记录为止,或到文件末尾。

【Linux 工具--AWK】

时间: 2024-12-15 20:59:38

【Linux 工具--AWK】的相关文章

Linux文本处理工具AWK使用解析

在linux系统上有三大文本处理工具分别是:grep,sed,awk,这次主要来看看awk. awk  option  'pattern'  file -F    指定分隔符: -v     申明自定义变量: 查看当前系统上,用户名和用户shell,输出分隔符为~. # awk -F: 'BEGIN{OFS="~";print "UserName   Shell"}{print $1,$7}END{print "================end===

【转载更新】Linux工具之AWK 3.高级知识

原文:http://blog.hexu.org/archives/41.shtml#id2874788 awk编程 14.1. 变量 在awk中,变量不需要定义就可以直接使用,变量类型可以是数字或字符串.赋值格式:Variable = expression,如$ awk ‘$1 ~/test/{count = $2 + $3; print count}’ test,上式的作用是,awk先扫描第一个域,一旦test匹配,就把第二个域的值加上第三个域的值,并把结果赋值给变量count,最后打印出来.

【转载 更新】Linux工具之AWK 2.基础知识

1. awk简介 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入.一个或多个文件,或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具.它在命令行中使用,但更多是作为脚本来使用.awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作.如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指

【转载更新】Linux工具之AWK 4.实例

======基 础 篇====== 1.无pattern的action实例 a.awk ‘{print NR $1 $NF}’data.txt   打印行号,第一列和最后一列,中间无分隔符 b.awk ‘{print $1,$NF}’ data.txt     打印第一列和最后一列,并且中间有分隔符 c.awk‘{print$0,$NF+10}’data.txt  打印整行,并打印 最后一行加上10的结果 2.有pattern的action实例 a.awk ‘/[0-9]/’ data.txt

【转载更新】Linux工具之AWK 2.基础知识

1.awk简介awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入.一个或多个文件,或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具.它在命令行中使用,但更多是作为脚本来使用.awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作.如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的

linux之文本处理工具awk

文本处理工具awk用法(介绍在最后) awk -v FS=: '{print $1,FS,$3}' /etc/passwd {FS}可省略 awk -v FS=: -v OFS=^^^ '{print $1,$3}' /etc/passwd awk -F: -v OFS=^^^ '{print $1,$3}' /etc/passwd awk -F: '{print $1,$NF}' /etc/passwd ls /media/cdrom/Packages/ | awk -F"." '{

linux sed&awk详解

sed sed为文本处理三剑客之一.本身就是一个管道命令,可以将文件进行增加,修改,删除,选取等操作. 格式:sed [-nrefi] [command] "文本字符串" 选项: -r: 支持扩展正则表达式: -n: 静默模式:(sed有个模式空间和保持空间,默认sed会将执行的结果保存到模式空间里面,而模式空间默认情况是输出在屏幕上,加了-n,则阻止将模式空间的内容输出到屏幕上) -f:/path/to/script_file:从指定的文件中读取脚本并运行 -e script1 -e

利用多核CPU来加速Linux命令 — awk、sed、bzip2、grep、wc

你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作--一些无法并行的操作.数据专家们,我是在对你们说.你可能有一个4核或更多核的CPU,但我们合适的工具,例如 grep, bzip2, wc, awk, sed等等,都是单线程的,只能使用一个CPU内核.借用卡通人物Cartman的话,"如何我能使用这些内核"?要想让Linux命令使用所有的CPU内核,我们需要用到GNU Parallel命令,它让我们所有的CPU内核在单机内做神奇的map-reduce操作

Linux工具参考篇(网摘)

Linux工具参考篇 原文出处:[Linux Tools Quick Tutorial] 1. gdb 调试利器 2. ldd 查看程序依赖库 3. lsof 一切皆文件 4. ps 进程查看器 5. pstack 跟踪进程栈 6. strace 跟踪进程中的系统调用 7. ipcs 查询进程间通信状态 8. top linux下的任务管理器 9. free 查询可用内存 10. vmstat 监视内存使用情况 11. iostat 监视I/O子系统 12. sar 找出系统瓶颈的利器 13.