AWK

### awk

awk分为nawk,gawk

我们shell中常用的awk 其版本是gawk

“`
AWK会把file中的每一行(记录/可以指定分隔符),读入空间中并默认以空白(TAB\space\\n)等分割成几个字段,每个字段用$#表示$0表示整行本身
“`

awk [Option] ‘program’ file

option

-F:制定输入时的字段分隔符

-v:var=VAR:自定义变量

program:Pattern{Action}

pattern:相当于地址定界

action:
一、print:输出到终端(相当于s1hell中的echo)

print item1,item2

1)以逗号为分隔符
2)输出的各item可以是字符串或数值:当前记录的字段、变量或awk的表达式
(字符串要以双引号引起来,如果$#被引起来那么输出则是$#而不是$#转换出来的变量值)
3)如果省略item,相当于print $0

示例:基本工作方式

“`
awk ‘{print $2″:”$4}’ /etc/fstab
/etc/fstab:
/data:defaults
/apache:defaults
/md1:defaults
/dev/shm:defaults
/dev/pts:gid=5,mode=620
/sys:defaults
/proc:defaults
[root@zhangxiao ~]#
“`

变量:变量需和-v一起使用
内建变量:
FS:默认输入分隔符(列)
OFS:默认输出分隔符(列)
RS:默认输入分隔符(行)
ORS:默认输出分隔符(行)

NF:字段数量
NR:行数量(也叫记录数量)(从1..往后编)
FILENAME:当前处理的文件名(每一行显示)

ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数

awk -v FS=: ‘{print $1}’ file
查找全文,每行按:为分隔符的列输出$1到屏幕

自定义变量

1)-v VAR=VARLUE
变量名字区分大小写
2)在program中直接定义

在{中引用变量(除了位置变量)不需要写$符}

[root@zhangxiao ~]#awk -v A=”hello” ‘BEGIN{print A}’
hello
[root@zhangxiao ~]#

printf命令

printf FORMAT,item1,item2…
1)format必须给出
2)不会自动换行,如果需要显示必须给出换行符\n
3)format中需要分别为后面的每一个item制定一个格式化符号

格式符
%c:显示字符的ASCII码
%d,%i:显示十进制整数
%e.%E:科学计数法数值显示
%f:显示浮点数
%g,%G:以科学计数法或者浮点数形式显示数值
%f:显示字符串
%u:无符号整数
%%:显示%自身

修饰符

#[.#]:第一个数字控制显示的宽度;第二个#表示小数点后的精度(不是小数可省略)
(默认为右对齐)
-:表示左对齐
+:显示数值符号

操作符
算数运算操作符

+

*
/
^
%
-x(负号)

赋值

=
+=
-=
*=
/=
++

比较
>
<
=
!=
>=
<=
模式匹配符

~ :是否匹配
!~:是否不匹配

匹配后面的pattern要加在//中间

例 :awk ‘$3~/bash$/{print $3}

逻辑操作符

&&
||

函数调用
founction_name(argu1,argu2….)

条件表达式:

selector?if-ture-expression:if-false-expression:三目表达式 如果真执行前面的表达式如果失败执行后面的表达式

PATTERN:

类似于地址定界
1):省略表示匹配每一行
2)/正则表达式/:仅处理能被此处的模式能匹配到的行
3)!//:对不匹配正则表达式匹配的行处理
4)关系型表达式:结果有真假(布尔值 ),结果为真的才处理
(结果非0或者非空时表示真。0和空字符串都表示假
6)//,//第一次匹配pattern1到第一次匹配pattern2
(此处不支持#,#的写法如果要用需要用判断如 wak -F: ‘(NR>=2&&NR<=10){print $1}

7)BEGIN/END模式:如果需要在文件处理之前或者之后执行一次的命令用这两个模式BEGIN{CMD}

常用的action

1)EXPRESSIONS:表达式
2)控制语句 :if while等
3)组合语句 :
4)输入语句
5)输出语句

控制语句:if(condition){statments}
if(condition){statments} else {statments2}

while (condition){statments}
do {statments} while (condition)
for(expr1;expr2;expr3){statments}

break,continue
delete array[下标]
delete array
exit
{statments}

详解控制语句

1) if(condition) statment {else statment}

示例:awk -v FS=: ‘{if($3>500) {print $3} else{print $1 ” is a user”}}’ /etc/passwd

使用场景,对awk取得的整行做条件判断

2)while(condition) statment

条件为真时进入循环,为假是跳出循环

使用场景:对一行内的多个字段进行注意处理时用,或对数组中的数据进行注意处理时需要用

length():内建函数,统计字符个数

示例
awk -F: ‘/root/{i=1;while(i<=NF){print $i,length($i);i++}}’ /etc/passwd
统计带有root的行每个单词以及单词的字符数

3)do-while循环

do statment while(condition)

至少执行一次循环体

4)for循环

for(expr1;expr2;expr3)statment

for(变量初始值;条件判断;变量修正) 循环体

示例

awk -F: ‘/root/{for(i=1;i<=NF;i++){if(length($i)>7){print $i,length($i)}}}’ /etc/passwd

for循环可以遍历数组中的每一个元素

语法
for (VAR in 数组名) 循环体

5)switch语句:

switch(expression){case VAR1 or /REGEXP/:statment;case VAR2 or /REGEXP/:statment2….default:statment}

6) continue和break

同shell
break [n]
continue

7) next :提前结束对本行的处理,直接进入下一行

8)数组

数组名[索引表达式]

索引表达式:
1)可以使用任意字符串
2)如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”

要判断数组中是否存在此元素,使用index in array 格式 进行

如果我们想要显示数组的元素值,直接调用不需要加$。

函数

内置函数

rand() :取随机0-1之间小数(一次)

length(【s】):显示字符串的长度

sub(r,s,[t]):用R表示的模式来查找t所表示的字符中匹配的内容,并将其第一次出现替换为s所表示的内容
gsub(r,s,[t]):全部替换

split(s,a,[r]):以r为分隔符 ,并将切割后的结果保存至a所表示的数组中

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/99027

发表评论

登录后才能评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班