awk命令详解 初级过滤用patterns 高级过滤用条件编程
- 2015-08-17 21:30:00
- admin
- 原创 2837
一、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