awk进阶整理

Posted 陈浩然MC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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进阶整理的主要内容,如果未能解决你的问题,请参考以下文章

新awk整理

awk用法整理

整理的几个好一点的awk案例

grep,sed,awk用法整理

JS进阶面试题整理(仅仅整理我做错的题)

linux学习:sed与awk与tr用法整理