Linux 下的编程语言awk 学习


awk 是Linux系统下的一个非常有用的用于处理文件和字符串的工具,他也提供内置函数,所以他也算是一门编程语言了。起类似作用的工具还有sed,grep等。这几天我会一直学习awk。

这里我只讲awk的命令,不会涉及awk的脚本,其实两者道理是一样的。

(1) awk 处理文件:
命令方式 awk -f 域分隔符 '模式 {动作}' 文件名

每次读取文件的一行,通过域分隔符将每行分隔成若干个域 ,分别用$1,$2, $3,...$9,&(10)...表示第一个域,第二个域。。。。, $0表示一行的所有域,默认是用空格作为域分隔符,这也是一般的方法,所以-f 域分隔符一般都不用。

awk与sed,grep一样,是将文件内容读取到缓存区中,对其进行操作,再将结果输出到屏幕上,不会对源文件进行修改,如果要修改源文件,使用如下形式

awk comand filename | tee filename

模式由一些选择语句(里面含有正则表达式进行特定行的匹配)组成,他表示什么时候激发动作的产生;模式有2个特殊的字段,BEGIN与END。BEGIN 表示报头,在浏览行之前执行,END表示报尾,在所有的浏览后执行。默认的模式是打印所有行。

动作一般是{print $1....} ,就是将每一行的某些域打印出来。

下面举一些例子讲述:
$ cat file
1 nm hello 2000
2 jack good 2001
3 eric happy 2002

$ awk '{print &0}' file
结果:
1 nm hello 2000
2 jack good 2001
3 eric happy 2002

$ awk '{print $1,$3,$4}' file
结果:
1 hello 2000
2 good 2001
3 happy 2002
$ awk 'BEGIN {print "begin test"}{print &0}END{print "end test"}' file
结果:
begin test
1 nm hello 2000
2 jack good 2001
3 eric happy 2002
end test
$ awk '{if($2=="nm") {print $0}}' file
$ awk '$2=="nm" {print $0}' file # 这两条命令结果一样,建议用第二条语句
1 nm hello 2000
$ awk '$3 ~ /o/ {print $0}' file
结果:
1 nm hello 2000
2 jack good 2001
$awk '$3 ~ /^h/ ' file
结果:
1 nm hello 2000
3 eric happy 2002 

相关内容