三、awk总体认识:
1)awk 其实是一种编程语言--可以叫作样式扫描和处理语言,它支持用户自定义变量,函数及执行控制,动态正则表达式等先进功能,是一强大编程工具
awk所做的工作类似数据库SQL语言,不同的是awk处理的是具有某些书写格式的文本,而数据库语言处理的则具备一定逻辑意义的字段组成的记录。
2)调用格式:
awk [ -F re] [parameter...] ['pattern {action}'] [-f progfile][in_file...]
说明:
*语义:awk先按照-F 后面的分割符把in_file分割为多列,然后逐行进行pattern匹配,如果匹配成功则执行action或者-f后面的awk脚本
*-F re:允许awk更改其字段分隔符,默认空格分开
*parameter: 该参数帮助为不同的变量赋值
*pattern参数可以是任何条件语句或复合语句或正则表达式
*action参数总是被大括号包围,它由一系统awk语句组成,各语句之间用";"分隔
*-f progfile:允许awk调用并执行文件名为progfile的awk语言文件。
*in_file awk需要处理的原始文件
*awk也使用"#"作为注释符
四、awk常用语法:
1)支持--自定义变量 #和C语言书写风格类似
total=0
2)支持--自定义函数
function 函数名(参数表){
函数体
}
3)支持-条件控制流程
if () else if () else {} #和C语言书写风格类似
4)支持-循环控制流程
while、do-while和for #和C语言书写风格类似
5)awk内置变量
*在awk程序中引用内置变量不需要使用标志符"$"
几个常用的内置变量:
NF 当前记录中的字段个数
NR 已经读出的记录数
FNR 当前记录数
FS 输入字段分隔符 空格
6)awk内置函数
常用的几个内置函数:
printf(format,variable) #格式化输出,按format提供的格式输出变量variable。
gsub(reg,string,target) #每次常规表达式reg匹配时替换target中的string
index(search,string) #返回string中search串的位置
length(string) #求串string中的字符个数
match(string,reg) #返回常规表达式reg匹配的string中的位置
split(string,store,delim) #根据分界符delim,分解string为store的数组元素
7)特殊语句:
awk的next语句导致awk读取下一个记录并完成模式匹配,然后立即执行相应的操作
awk的 getline语句用于简单地读取一条记录
awk中允许在程序中关闭一个输入或输出文件,方法是使用awk的close语句
awk中允许用printf和管道将结果输出到一个文件/命令
BEGIN:任何在BEGIN之后列出的操作(在{}内)将在awk开始扫描输入之前执行
END:END之后列出的操作将在扫描完全部的输入之后执行
8)awk与shell script混合编程:
awk读取Shell script程序变量,通过"'$变量名'"的方式读取sell scrpit程序中的变量
将shell命令的执行结果送给awk处理,通过管道线(|)传递给awk处理
shell script程序读awk的执行结果,变量名=`awk语句`,也可以用管道的方法将awk执行结果传递给shell script程序处理
在awk中执行shell命令行----嵌入函数system()
awk的语法和C语言的语法在一定程度上有点类似,这也节省了记忆的时间。
9)常用用法举例:
#每行后面增加一行空行 awk '1;{print ""}' ./test
#给非空白行的行加上编号 awk 'NF{$0=++a " :" $0};{print}' ./test
#计算行数 (模拟 "wc -l") awk 'END{print NR}' ./test 或 awk '{i++}END{print i}' 或 sed -n '$=' ./test
#计算每行每个区域之和 awk '{s=0; for (i=1; i<=NF; i++) s=s+$i; print s}' ./test
#计算所有行所有区域的总和 awk '{for (i=1; i<=NF; i++) s=s+$i}; END{print s}' ./test
#删除每行前的空白并左对齐 awk '{sub(/^[ \t]+/, "")};1' ./test
#删除每行结尾的空白 awk '{sub(/[ \t]+$/, "")};1' ./test
#每行用 "bar" 查找替换 "foo" awk '{gsub(/foo/,"bar")}; 1' ./test
#调换前两列的位置 awk '{temp = $1; $1 = $2; $2 = temp}' ./test
#打印文件的前十行=head awk 'NR < 11' ./test
#打印文件的后十行=tail awk '{A[NR]=$0}END{for(i=NR-9;i<=NR;i++)print A[i]}' 或 sed -e :a -e '$q;N;11,$D;ba'
#打印匹配正则表达式的行=grep awk '/regex/' ./test
#打印不匹配正则表达式的行=grep -v awk '!/regex/' ./test
#打印第5列等于"abc123"的行 awk '$5 == "abc123"' ./test
#删除所有空白行 awk NF 或 awk '/./' ./test
#删除重复连续的行 awk 'a !~ $0; {a=$0}' ./test
学习资料:
GNU awk:
AWK单行脚本快速参考:
经典书籍《sed & awk》
五、sed & awk的比较:
0)sed只是一个小工具,而awk则相当于是一门语言,两者的复杂性不可以比。
1)sed & awk都不修改原输入文件内容
2)grep awk sed 都有正则表达式匹配的功能,但是三者的正则表达式语法就点不同
3)awk支持对记录和字段的处理,而grep/sed只能对行进行处理。
4)如果是按行操作,就统统都用 sed;如果是不仅按行,还要按列操作,就统统都用 awk
5)awk对正则表达式支持的程度比sed要差些,文本处理方面perl相当于awk/sed/grep的一个高度概括。
6)其他待补充
六、cut命令:
利用cut命令也可以达到awk的获取特定格式文件中的特定列或字段的简单功能
命令用法:
cut -b list [-n] [file ...]
cut -c list [file ...]
cut -f list [-d delim][-s][file ...]
*上面的-b、-c、-f分别表示字节、字符、字段(即byte、character、field);
*list表示-b、-c、-f操作范围,n表示只有第n项,n-表示从第n开始到行尾,n-m表示从第n项到第m项,-m表示从行开始到第m项。
*file表示的自然是要操作的文本文件的名称;
*delim(英文全写:delimiter)表示分隔符,默认情况下为TAB;
*-s表示不包括那些不含分隔符的行(这样有利于去掉注释和标题)
举例:
比如:将系统所有用户名保存到特定的文件,可以用:cut -d: -f 1 /etc/passwd > /tmp/users
阅读(1180) | 评论(0) | 转发(0) |