perl
语言中的AWK之基础篇
一
:AWK与perl
- 1.?Perl,我们并不陌生了到目前为止,它在web编程中的强大作用,对于每个web开发者而言,重要性不言而喻,
- 由于perl借取了C、sed、awk、shell?scripting以及很多其他程序语言的特性。
- 其中最重要的特性是它内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN。
- 简而言之,Perl?象C一样强大,象awk、sed等脚本描述语言一样方便,由此看来在perl语言中,AWK占据着重要的一席之地。
- 这里我们不去重点的说perl语句而是介绍一下其重要的组成部分AWK的基础内容,
- 下面我们就来揭开perl中的awk的神秘面纱吧!?
二:AWK简介
- what?is?awk??对于初学者来说这是个模式的代名词,其实awk是三位创造者Aho、Weinberger和Kernighan统称,
- 简单的来说AWK?是一种用于处理文本的编程语言工具??
- wk可以做些什么?由于其可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。
- 它具备了一个完整的语言所应具有的几乎所有精美特性,所以其三位创建者已将它正式定义为“样式扫描和处理语言”。
- 它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。??
三:
AWK处理文本的流程:
- awk在处理文件时,首先扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。
- 如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行?
四:
AWK的使用
- AWK的?语法格式:??
- Awk?[options]?‘scritpts’??filename??
- ?或者awk?[options]?‘partern?[actions]?’?filename??
- [options]:??
- -F:?指定awk?处理文本的行时的分隔符
?例如?
- 常用的awk内置的三个变量?OFS??FS??NF???
- -FS?指定字段分隔符
- 例如 ?
- Awk??-v?FS=:?‘{print?$2}’?/etc/passwd??
- -v?OFS=?定义awk?输出时的字符分隔符?
- 例如:?Awk?–v?OFS=#?‘{print?$1,$2}’?/etc/passwd
- 注:上例中的在输入$1和$2,$1,$2的形式是分别输出$1和$2.?$1?$2的形式是将$1和$2合并后输出??
- 如??
- ?NF?表示awk处理一行时的字段总数??
- ?例如:输出一行的最后一个字段??
- Awk?‘{print?$NF}’?/etc/passwd?
- 注:显示一行的倒数第三个字段???
- printf?的使用??
- 格式:printf?format?item1,item2,……??
- ?注意:??
- 1:与print命令的最大不同是,printf?需要指定format??
- 2:format用于指定后面的每个item的输出格式??
- 3:printf语句不会自动打印换行符?n??
- 4:format格式的指示符都以%开头,后跟一个字符??
- format:??
- %c?:显示字符的ASCII码??
- %d,%i?:显示字符的十进制整数??
- %e,$E?科学计数法显示数值??
- %f?:显示浮点数??
- %g?,%G?:以科学计数法的格式或者浮点数的格式显示数值??
- %s??显示字符串??
- %u??显示无符号整数??
- %%?显示%自身??
- 另外format?还可以添加修饰符??
- N:显示宽度??
- -:左对齐??
- +:显示数值符号??
- 例如:?
- Awk?中使用?输出重定向??
- print?items?>?output-file??
- print?items?>>?output-file??
-
print?items?|?command???
awk的操作符:?
- 算术操作符:??
- -x:?负值??
- +x:?转换为数值;??
- x^y:???
- x**y:?次方??
- x*y:?乘法??
- x/y:除法??
- x+y:??
- x-y:??
- x%y:??
- 字符串操作符:??
- 只有一个,而且不用写出来,用于实现字符串连接;??
- 赋值操作符:??
- =??
- +=??
- -=??
- *=??
- /=??
- %=??
- ^=??
- **=??
- ++??
- --??
- 需要注意的是,如果某模式为=号,此时使用/=/可能会有语法错误,应以/[=]/替代;??
- 布尔值?
- awk中,任何非0值或非空字符串都为真,反之就为假??
- ?比较操作符:??
- x?<?y???????True?if?x?is?less?than?y.???
- x?<=?y??True?if?x?is?less?than?or?equal?to?y.???
- x?>?y???????True?if?x?is?greater?than?y.???
- x?>=?y??True?if?x?is?greater?than?or?equal?to?y.???
- x?==?y??True?if?x?is?equal?to?y.???
- x?!=?y??True?if?x?is?not?equal?to?y.???
-
x?~?y??????True?if?the?string?x?matches?the?regexp?denoted?by?y.???
- x?!~?y??True?if?the?string?x?does?not?match?the?regexp?denoted?by?y.???
- subscript?in?array????True?if?the?array?array?has?an?element?with?the?subscript?subscript??
- ?表达式间的逻辑关系符:??
- ?&&??
- ||?
- 条件表达式:??
- selector?if-true-exp:if-false-exp??
- ?selector?:条件表达式??
- ?if-true-exp:statement??
- ?if-false-exp:?statement??
- awk的模式:??
- awk?[options]?‘parten’?‘print?….’?filename??
- parten:??
- 1:正则表达式?格式为/regular?expression/??
- 2:?表达式??其值非0或者非空字符时满足的条件??例如:$1?~?/user/?或者?$1?==?‘user’??
- 用运算符~(匹配)和?~?!(不匹配)??
- 例如:?
- 指匹配范围格式为pat1,pat2?(pat代表模式)同sed用法??
- ?BEGIN/END?特殊格式???
- ???BEGIN?:在awk执行动作之前的处理动作??
- ????让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量??
- ?END:在awk?执行动作完成后执行的动作??
- ????让用户在最后一条输入记录被读取之后发生的动作??
- 例如:?
- Awk?–F:’$NF?~/bash/?{print?“username?bash”?;printf?“%-10s?%sn,$1,$NF”}’?/etc?/passwd
?空模式是指 :匹配所有行
由于篇幅限制字数限制不能全部介绍,如有错误,还望多多指正,多多讨论,谢谢。下篇
将继续awk的循环控制语句的使用,