awk命令详解 初级过滤用patterns 高级过滤用条件编程

2015-08-17 21:30:00
admin
原创 2837
摘要:awk命令详解 初级过滤用patterns 高级过滤用条件编程

一、awk基本介绍

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk分析数据并生成报告时非常强大。简单来说awk把文件逐行读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。


1、命令行方式执行awk指令
awk [-F field-separator] commands input-file(s)
field-separator支持正则表达式,commands可以包含多个动作,input-file是待处理的文件;
文件的每一行使用域分隔符分隔,分割的每一项是一个域,默认的域分隔符是空格;


2、文件方式执行awk指令

awk [-F field-separator] -f awk-script input-file(s)

#!/bin/awk
BEGIN{
    print "begin";
}

NF{
    print $1;
}
END{
    print "end";
}


二、入门实例

显示机器所有账户:

cat /etc/passwd | awk -F ':' '{print $1}'


显示机器所有账户和shell,并用tab分隔:

cat /etc/passwd | awk -F ':' '{print $1"\t"$7}'


添加开始和结尾:

cat /etc/passwd | awk -F ':' 'BEGIN{print "name,shell"}  {print $1","$7} END{print "noname,nosh"}'


显示以root开头的所有行,默认动作是输出行:

awk -F ':' '/^root/' /etc/passwd


整数或者字符串比较过滤:

awk -F ':' '$1>=9{print $1}' myfile

awk -F ':' '$1>="str"{print $1}' myfile


正则表达式过滤,可以有多个动作:

awk '/3/{print $0,"catch"} !/3/{print $0}' myfile
awk '{if($0~/3/)print $0;else print $0;}' myfile


管道进行排序:

awk 'BEGIN{FS=":"} {print $1 | "sort"}' /etc/passwd


执行外部命令:

awk 'BEGIN{FS=":"} {system("ls")}' /etc/passwd


获取httpd进程pid:

ps aux | grep httpd | grep -v grep | awk '{print $2}'


三、awk内置变量

ARGC,命令行参数个数;
ARGV,命令行参数数组;
ENVIRON,系统环境变量数组;
FILENAME,处理的文件名;
FNR,当前处理行在文件中的行数;
NR,当前已经处理的行数,值和FNR一样;

NF,当前处理行有多少列,$NF最后一个元素,$(NF-1)倒数第二个元素;

FS,设置输入域分隔符,等价于-F参数;
OFS,输出域分隔符;

RS,输入记录分隔符;
ORS,输出记录分隔符;


四、awk编程

定义变量,整数默认零,字符串默认空串:

awk '{count++; print $0;} END{print "user count is ", count}' /etc/passwd


统计文件夹空间大小:

ls -l | awk 'BEGIN{size=0;} {size=size+$5;} END{print "size is", size/1024/1024, "M"}'


条件语句同C语言一致if、for、while、continue、break:

ls -l | awk 'BEGIN{size=0;} {if($5!=4096){size=size+$5;}} END{print "size is", size/1024/1024,"M"}' 


数组,索引可以是数字和字符串:

awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd

awk 'BEGIN{a[0]=100;a[1]=200;}END{for (i in a) print i,a[i];}' myfile


五、awk支持的patterns

/regular expression/,字符串是否包含正则表达式
relational expression,关系操作符,支持整数和字符串
pattern && pattern
pattern || pattern
pattern ? pattern : pattern
(pattern)
! pattern
pattern1, pattern2


六、awk字符串以及常用函数

字符串:

1、字符串可以直接连接或者使用空格连接;

2、print类似python语法,printf类似C语法;


常用函数:

Numeric Functions:exp、int、log、rand、srand

String Functions:asort、length

Time Functions:mktime、strftime

Bit Manipulations Functions:and、xor

I/O Statements:print、printf


七、awk引用shell变量

BEGIN块执行后初始化

test='awk code'

echo | awk '{print test}' test="$test"


BEGIN块执行前初始化

test='awk code'

echo | awk -v test="$test" 'BEGIN{print test}'


直接引用shell变量,变量不能包含空格

test='awk_code'

echo | awk 'BEGIN{print "'$test'"}'


直接引用shell变量,变量可以包含空格

test='awk code'

echo | awk 'BEGIN{print "'"$test"'"}'


八、NF变量妙用

过滤空行,空行NF=0不会打印行:

awk NF myfile


不输出后面2个字段:

awk -F ':' 'NF>=2 && NF-=2' myfile


不输出前面2个字段:

awk -F ':' 'NF>=3{for(i=3;i<NF;i++)printf("%s ",$i);print $NF}' myfile


利用NF=NF或者NF+=0进行OFS替换,替换分割符必须有动作才能生效:

awk -F ':' 'BEGIN{OFS="\n"} NF=NF' myfile

发表评论
评论通过审核之后才会显示。