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的谷歌翻译
顶多夹杂着自己的一些资料,理解,微乎其微。
但胜过不去思考,人生不是在思考中进步的吗?