Linux下awk用法

来源:互联网 发布:java项目怎么编译 编辑:程序博客网 时间:2024/05/16 19:48

awk
awk语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息。awk抽取信息后,才能进行其他文本操作。

命令行方式调用awk
awk [-F field-separator] ‘commands' input-file
[-F field-separator]域分隔符是可选的。因为awk使用空格作为缺省的域分隔符。因此要浏览域间有空格的文本,不必指定这个选项,但如果要浏览诸如passwd文件,此文件域以冒号作为分隔符,则必须指明-F选项。如awk -F : ‘commands' input-file
commands是awk命令。

awk读文件记录的方式
awk每次在文件中读一行,找到域分隔符,设置其为域n,直到新一行,然后划分这一行为一条记录,接着awk再次启动下一行读进程。

模式和动作
任何awk语句由模式和动作组成,在一个awk脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。如果省略模式部分,动作将时刻保持执行状态。
模式可以是任何条件语句或复合语句或正则表达式。模式包含两个特殊字段,BEGIN和END。
使用BEGIN语句设置计数和打印头,BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行。END语句用来在awk完成文本浏览动作后打印输出文本总数和结尾状态标志。
实际动作在大括号{}内指明。动作大多数用来打印。如果不指明采取动作,awk将打印出所有浏览出来的记录。

域和记录
awk执行时,其浏览域标记为$1,$2,$3......$n ,$0表示所有域。使用$1,$3表示第一和第三域。
例子:
1)awk -F : ‘{print $0}' /etc/passwd
2)打印第1,2,3域名
awk -F : ‘{print $1,$2,$3}' /etc/passwd
3)打印报告头
awk -F : ‘BEGIN {print "Name/tPasswd/n------------------------------------------------"}
{print $1"/t"$2}' /etc/passwd
4)打印信息尾
awk -F : 'BEGIN {print "Name/tPasswd/n----------------------"} {print $1"/t"$2}
END {print "---------------------------/nend"}' /etc/passwd

awk中正则表达式及其操作
在awk中,正则表达式用斜线括起来。例如在文本中查找字符串abc ,使用/abc/即可。

awk操作符
操作符 描述
< 小于
<= 小于等于
== 等于
!= 不等于
>= 大于等于
~ 匹配正则表达式
!~ 不匹配正则表达式
&& AND
|| OR
! 非

1)第一个域匹配system的所有域
awk -F : ‘{if($1~/system/) print $0}' /etc/passwd
2)不匹配
awk -F : ‘{if($1!~/system/) print $0}' /etc/passwd
3)第三个域等于1000的所有域
awk -F : ‘$3=="1000" {print $0}' /etc/passwd
4)设置大小写
awk -F : ‘/[Aa]bc/' /etc/passwd
5)关系匹配
awk -F : '{if($1~/(system|root)/) print $0}' /etc/passwd

awk内置变量
awk有许多内置变量用来设置环境信息。
变量名称 描述
ARGC 命令行参数个数
ARGV 命令行参数数组
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
NR 已读的记录数
NF 记录的域个数
FS 设置输入域分隔符,等价于命令行-F选项
OFS 输出域分隔符
ORS 输出记录分隔符

ARGC支持命令行中向awk脚本传入的参数个数。
ARGV是ARGC的参数排列数组,其中每一个元素表示为ARGV[n], n为期望访问的命令行参数。
FILENAME是awk脚本实际操作的输入文件。awk可以同时处理多个文件,此变量表示系统目前正在浏览的实际文件。
FNR是awk目前操作的记录数。
NR是已读的记录数。
NF是浏览记录的域个数
FS用来设置域分隔符,等价于命令行的-F。
OFS输出域分隔符,默认为空格,如果想设置为:则OFS=":"。
ORS为输出记录分隔符,缺省为新行( / n)。

NF、NR、FILENAME应用
输出所有记录,并带有域的个数,记录号以及在最后输出文件名。
awk -F : ‘{print NF,NR,$0} END {print "-----------------------/n"FILENAME}' /etc/passwd

awk内置字符串函数
1)length
echo ‘abc' | awk ‘{print length($1)}'
2)split
使用split将字符串划为数组并返回数组元素个数
awk 'BEGIN {print split("123#123#123", arr, "#")}'
3)substr
按照起始位置及长度返回字符串的一部分
awk -F : '$1=="system" {print substr($1, 0, 3)}' /etc/passwd

awk格式化输出
awk printf 修饰符号
左对齐
awk printf格式
%c ASCII字符
%d 整数
%e 浮点数,科学记数法
%f 浮点数,例如(123.44)
%g awk决定使用哪种浮点数转换e或者f
%o 八进制数
%s 字符串
%x 十六进制数
awk -F : '{printf "%-s %s/n", $1,$2}' /etc/passwd
输出文件的第1,2域,并且左对齐。

awk数组
数组使用前,不必定义。也不必指定数组元素个数。经常使用循环来访问数组。
下面是一个awk示例脚本
arraytest.awk
#!/usr/bin/awk -f
BEGIN{
str="123#123#123";
split(str, array, "#");
}
END{
for (i in array) {
print array[i];
}
}

 

原创粉丝点击