首页 > 代码库 > awk进阶整理

awk进阶整理

BEGIN{写在前言,我英语不好,有许多地方直接使用的谷歌翻译。为了能理清awk工具使用的思路,详情还要看awk说明书(man awk)
或者http://www.gnu.org/software/gawk/manual/gawk.html#Regexp}
awk初学之常见问题
http://bbs.chinaunix.net/thread-2309494-1-1.html
awk介绍

awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。
数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。
它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。
它在命令行中使用,但更多是作为脚本来使用。
awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

awk命令格式和常用选项
命令格式
awk [options] ‘script‘ var=value file(s)
awk [options] -f scriptfile var=value file(s)
常用选项
-F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
-v var=value 赋值一个用户定义变量,将外部变量传递给awk
-f scripfile 从脚本文件中读取awk命令

awk的工作原理
awk ‘BEGIN{ commands } pattern{ commands } END{ commands }‘
第一步:执行BEGIN{ commands }语句块中的语句;
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,
从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
第三步:当读至输入流末尾时,执行END{ commands }语句块。

BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,
比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。
END语句块在awk从输入流中读取完所有的行之后即被执行,
比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。
pattern语句块中的通用命令是最重要的部分,它也是可选的。
如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

AWK程序的完整执行方式
AWK PROGRAM EXECUTION
An AWK program consists of a sequence of pattern-action statements and optional function definitions.

pattern { action statements }
function name(parameter list) { statements }

了解变量,记录和字段
自定义变量 -v

awk内置变量(预定义变量)
内置变量
Gawk的内置变量是:

ARGC 命令行参数的数量(不包括gawk的选项或程序源)。

ARGIND 正在处理的当前文件的ARGV中的索引。

ARGV 命令行参数数组。该阵列从0到ARGC - 1索引。动态更改ARGV的内容可以控制用于的文件数据。

BINMODE / O指定使用“二进制”模式。数字值为1,2或3,指定输入文件,输出文件或全部文件分别应使用二进制I / O。
“r”或“w”的字符串值分别指定输入文件或输出文件应使用二进制文件I / O。
“rw”或“wr”的字符串值指定所有文件应使用二进制I / O。任何其他字符串值被视为“rw”,但会生成警告信息。

CONVFMT 默认情况下,数字的转换格式为“%.6g”。

ENVIRON 包含当前环境值的数组。该数组由环境变量索引,每个元素都是该值的值变量(例如,ENVIRON [“HOME”]可能是/ home / arnold)。
改变这个数组不影响通过gawk生成的程序所看到的环境重定向或system()函数。

ERRNO 如果发生系统错误,或者对getline进行重定向,在readline的读取期间或在close()期间,则ERRNO将包含一个字符串描述错误。
该价值需要翻译成非英文文字。

FIELDWIDTHS 字段宽度的白色空格分隔列表。当设置时,gawk将输入解析为固定宽度的字段,而不是使用FS变量的值作为字段分隔符。

FILENAME 当前输入文件的名称。如果在命令行中没有指定文件,则FILENAME的值为“ - ”。
但是,FILENAME内部未定义BEGIN块(除非由getline设置)。

FNR 当前输入文件中的输入记录号。
http://www.cnblogs.com/irockcode/p/7044722.html

FS 输入字段分隔符,默认为空格。请参阅上面的字段。

IGNORECASE 控制所有正则表达式和字符串操作的区分大小写。如果IGNORECASE具有非零值,则进行字符串比较和模式规则匹配,
FS分割,与RS记录分离,与?和!?的正则表达式匹配,gensub(),gsub(),index(),match(),split()和sub()
内置函数在执行正则表达式操作时都会忽略大小写。
注意:数组下标不受影响。
但是,asort()和asorti()函数会受到影响。
因此,如果IGNORECASE不等于零,/ aB /匹配所有字符串“ab”,“aB”,“Ab”和“AB”。
与所有AWK变量一样,初始值为IGNORECASE为零,因此所有正则表达式和字符串操作通常区分大小写。
在Unix下,完整的ISO 8859-1 Latin-1字符集被忽略的情况下使用。
从gawk 3.1.4开始,基于C <ctype.h>的设备,如isalpha()和TOUPPER()。

LINT 提供AWK程序内的--lint选项的动态控制。如果真的,gawk打印棉绒警告。
当虚假的时候,它不会。分配时字符串值“致命”,lint警告成为致命错误,完全像--lint =致命。任何其他真正的值只是打印警告。

NF 当前输入记录中的字段数。

NR 迄今为止看到的输入记录总数。

OFMT 默认情况下,数字的输出格式为“%.6g”。

OFS 输出字段分隔符,默认为空格。

ORS 输出记录分隔符,默认为换行符。

PROCINFO 此数组的元素提供有关正在运行的AWK程序的信息的访问
在某些系统上,阵列中可能有元素,“group1”通过“groupn”为一些n,这是进程的补充组的数量使用in操作符测试这些元素。

RS 输入记录分隔符,默认为换行符。

RT 记录终止符。 Gawk将RT设置为与RS指定的字符或正则表达式匹配的输入文本。

RSTART 与match()匹配的第一个字符的索引; 0如果没有匹配。 (这意味着字符索引从一个开始。)

RLENGTH 由match()匹配的字符串的长度; -1如果没有匹配。

SUBSEP 用于在数组元素中分隔多个下标的字符,默认为“\ 034”。

TEXTDOMAIN AWK程序的文本域; 用于查找程序字符串的本地化翻译。



awk数组
关于awk数组的理解
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=2312439&highlight=awk%2B%CA%FD%D7%E9
数组结合+=统计题
http://www.cnblogs.com/irockcode/p/7044541.html
去重
awk ‘!a[$0]++‘ file
http://www.cnblogs.com/irockcode/p/7044646.html
awk变量类型和转换
Variable Typing And Conversion

八进制和十六进制常量

字符串常量
AWK中的字符串常量是双引号(“)之间的字符串,在字符串中,
某些转义序列被识别,如C.

\\一个字面反斜杠。

\ a“警报”字符; 通常是ASCII BEL字符。

\ b退格。

\ f表单。

\ n换行。

\ r回车。

\ t水平选项卡。

\ v垂直选项卡。

\ xhex数字
由\ x之后的十六进制数字字符串表示的字符。 如ANSI C所有
以下十六进制数字被视为转义序列的一部分。 (此功能应该告诉
我们关于委员会的语言设计。)例如,“\ x1B”是ASCII ESC(转义)字符。

\ ddd由八位数字的1,2或3位数字表示的字符。 例如,“\ 033”是
ASCII ESC(转义)字符。

\ c字面字符c。
转义序列也可以在常量正则表达式内使用(例如/ [\ t \ f \ n \ r \ v] / 匹配空格字符)。
在兼容模式下,处理由八进制和十六进制转义序列表示的字符
字面上用于正则表达式常量。因此,/ a \ 52b /相当于/ a \ * b /。

awk模式和操作
Patterns
AWK 模式一般有以下几种:

BEGIN
END
/regular expression/
relational expression
pattern && pattern
pattern || pattern
pattern ? pattern : pattern
(pattern)
! pattern
pattern1, pattern2


正则表达式
原本翻译了man的所有正则表达式,但想想还是删了,毕竟我只是用谷歌翻译,结果多少会有不准确
这里就算是个总结吧,但有几点,正则表达式不是通用的,是看工具是否支持的
通配符与正则也会有冲突
附上晚上找的资料链接
http://blog.csdn.net/miss_acha/article/details/24462519
https://zhidao.baidu.com/question/2203723809768255508.html
http://www.cnblogs.com/xiongyunqi/p/3735846.html
http://bbs.chinaunix.net/thread-1049373-2-1.html
正则表达式awk[完全手册]
http://www.cnblogs.com/nhlinkin/p/3647357.html
http://www.gnu.org/software/gawk/manual/gawk.html#Regexp

操作(actions)
动作语句用大括号{和}括起来。 行动声明包括通常的分配,条件和循环语句
在大多数语言中发现。 运算符,控制语句和输入/输出语句可以在C之后进行图案化。

AWK运算符
Operators
The operators in AWK, in order of decreasing precedence, are

(...)Grouping

$ Field reference.

++ --Increment and decrement, both prefix and postfix.

^ Exponentiation (** may also be used, and **= for the assignment operator).

+ - !Unary plus, unary minus, and logical negation.

* / %Multiplication, division, and modulus.

+ - Addition and subtraction.

spaceString concatenation.

| |& Piped I/O for getline, print, and printf.

< >
<= >=
!= ==The regular relational operators.

~ !~ Regular expression match, negated match. NOTE: Do not use a constant regular expression
(/foo/) on the left-hand side of a ~ or !~. Only use one on the right-hand side. The
expression /foo/ ~ exp has the same meaning as (($0 ~ /foo/) ~ exp). This is usually not
what was intended.

in Array membership.

&& Logical AND.

|| Logical OR.

?: The C conditional expression. This has the form expr1 ? expr2 : expr3. If expr1 is true,
the value of the expression is expr2, otherwise it is expr3. Only one of expr2 and expr3 is
evaluated.

= += -=
*= /= %= ^= Assignment. Both absolute assignment (var = value) and operator-assignment (the other forms)
are supported.

Control Statements

AWK的逻辑控制语句
The control statements are as follows:

if (condition) statement [ else statement ]
while (condition) statement
do statement while (condition)
for (expr1; expr2; expr3) statement
for (var in array) statement
break
continue
delete array[index]
delete array
exit [ expression ]
{ statements }

输入输出语句

I/O Statements

The input/output statements

常用语句
getline
next
awk中next的用法
http://blog.chinaunix.net/uid-7685522-id-2045805.html
print
printf
printf语句用法
close

内置函数
算术函数

字符串函数

一般函数

时间函数


END{附在最后,awk的一些资料,其中有些已经贴在文中,这里来一个汇总吧
awk的-F分隔符问题
http://bbs.chinaunix.net/thread-4262179-1-1.html
shell编程大赛
http://bbs.chinaunix.net/thread-2319120-1-1.html
awk初学之常见问题
http://bbs.chinaunix.net/thread-2309494-1-1.html
awk中next的用法
http://blog.chinaunix.net/uid-7685522-id-2045805.html
RS、ORS、FS、OFS相关问题
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1354674&page=1
awk数组学习心得
http://blog.chinaunix.net/uid-2598756-id-293231.html
FNR=NR问题
http://bbs.chinaunix.net/thread-4084132-1-1.html
参考的命令awk
http://man.linuxde.net/awk
}

 

PS:

其实好多内容别人都已经整理过,但自己整理的才是自己的,回头看看自己的这篇,就是一篇man awk的谷歌翻译

顶多夹杂着自己的一些资料,理解,微乎其微。

  但胜过不去思考,人生不是在思考中进步的吗?

awk进阶整理