使用awk心得整理

前段时间用AWK处理文本生成报表,用起来非常不错。在这里做个记录。
AWK擅长于文本处理和报表生成,有许多精心设计的特性,允许进行多种方式的编程,一旦学会,将给大家带来新的数据处理体验。

AWK 总结 1
1、方式&结构 1
2、行&列匹配与正则表达式 2
2.1行匹配 2
2.2列匹配 2
3、if判断 循环(break,continue) 运算符 2
4、特殊符号 3
5、数组&内建函数 3
6、自定义函数和作用域 4
7、解决作用域 技巧 4

1、方式&结构

1、awk 'BEGIN{} {} END{}' $file //直接在命令行中
2、[root@node91 xie]# vi test.awk //把awk脚本写入文件
!/bin/awk
BEGIN{ //(注意)BEGIN 和 { 必须在同一行
FS=“:“;
}
{
print $1;
}
END{ //(注意)END 和 { 必须在同一行
}
[root@node91 xie]# echo | awk -f test.awk $file //执行awk脚本处理来处理$file

AWK代码结构

BEGIN块初始化, {} 主题代码 END块用与最终输出以及汇总操作

示列 //$_下标

awk 'BEGIN{FS=“:” ; i=0} {i+=1;print $1} END{ print “—>“,i,“lines” }' /etc/passwd

2、行&列匹配与正则表达式
2.1行匹配
》awk 'BEGIN{} /root/{print $0} END{}' /etc/passwd
等价于
》awk 'BEGIN{} $0~/root/{print $0} END{}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
2.2列匹配
》 awk 'BEGIN{FS=“:“} $1~/root/{print $0} END{}' /etc/passwd //正则表达式
root:x:0:0:root:/root:/bin/bash
》 awk 'BEGIN{FS=“:“} $1==“root”{print $0} END{}' /etc/passwd //选取某一列相等
root:x:0:0:root:/root:/bin/bash
》awk 'BEGIN{FS=“:“} ($1==“root”) &&($2==“x”){print $0} END{}' /etc/passwd //多个判断
root:x:0:0:root:/root:/bin/bash
写成文件
!/bin/awk
BEGIN{FS=“:”
}
($1==“root”) &&($2==“x”) { //(注意)这里必须在同一行,awk更想JAVA的打花括号方式
print $0
}
END{
}

3、if判断 循环(break,continue) 运算符
if
awk 'BEGIN{FS=“:“} {if($0~/root/ && $1==“root”){print $0}} END{}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
for
awk 'BEGIN{FS=“:“} {print $0 ; for(i=0;i<3;i++){print "\n"}} END{}' /etc/passwd
//每行打印三个空行
do_while
awk 'BEGIN{} {print $0;i=0;do{ print “\n” ;i ++ }while(i<3) } END{}' /etc/passwd
while
awk 'BEGIN{} {print $0;i=0;while(i<3){ print "\n" ;i ++ }} END{}' /etc/passwd
运算符
awk 'BEGIN{i=“0”} { i++;print i} END{}' /etc/passwd
//awk 做数学运算时,把能够转化为数字的字符串做转化,不能的转化为0

4、特殊符号
FS 字段分隔符
awk 'BEGIN{i=“t”;FS=“:“} { i++;print NF} END{}' /etc/passwd
NF 字段数目
awk 'BEGIN{i=“t”;FS=“:“} { i++;print NF} END{}' /etc/passwd
NR 第几行
awk 'BEGIN{i=“t”;FS=“:“} { i++;print NR} END{}' /etc/passwd
RS 记录分隔符变量 默认为\n
cat /etc/passwd | xargs
cat /etc/passwd | xargs | awk 'BEGIN{RS=“nologin”} {print “—“$0} {}'
OFS 打印逗号代替符
echo “” | awk 'BEGIN{OFS=“—YES—“} {print “1”,“2”} END{}'
ORS,全称是“输出记录分隔符”
echo “” | awk 'BEGIN{ORS=“\n\n” ; OFS=“—YES—“} {print “1”,“2”;print “3”,4} END{}'

5、数组&内建函数
数组
!/bin/awk
BEGIN{
months[“Jan”]=“01”;months[“Feb”]=“02”;
months[“Mar”]=“03”;months[“Apr”]=“04”;
months[“May”]=“05”; months[“Jun”]=“06”;
months[“Jul”]=“07”;months[“Aug”]=“08”;
months[“Sep”]=“09”;months[“Oct”]=“10”;
months[“Nov”]=“11”;months[“Dec”]=“12”;
}
{
for(i in months){
print i,” —>“,months[i];
}

内建函数
awk 'BEGIN{FS=“:“} {print “length->“,length($0);print “index->“,index($0,“root”);print toupper($0) } END{}' /etc/passwd

6、自定义函数和作用域
自定义函数
echo | awk 'BEGIN{} function test(){ for(i=0;i<5;i++){print “——“,i}}{ i=0;for(i=0;i<3;i++){print “^^^^“,i ; test()} } END{}'

echo | awk 'BEGIN{} function test(){ for(j=0;j<5;j++){print “——“,j}}{ i=0;for(i=0;i<3;i++){print “^^^^“,i ; test()} } END{}'

7、解决作用域 技巧

利用函数参数局部化
echo | awk 'BEGIN{} function test(i){ for(i=0;i<5;i++){print “——“,i}}{ i=0;for(i=0;i<3;i++){print “^^^^“,i ; test()} } END{}'

如果x,y是输入参数呢?
echo | awk 'BEGIN{} function test(x,y,i){ for(i=0;i<5;i++){print “——“,i}}{ i=0;for(i=0;i<3;i++){print “^^^^“,i ; test()} } END{}'

技巧,加个标识隔开
echo | awk 'BEGIN{} function test(x,y,_END,i){ for(i=0;i<5;i++){print "------",i}}{ i=0;for(i=0;i<3;i++){print "^^^^",i ; test()} } END{}'
多个AWK文件?

你可能感兴趣的:(linux,shell,awk)