shell_awk(二)

2014-11-24 08:56:51 · 作者: · 浏览: 1
"name""\t""ID"} {if($1 ~/mary/) print $0}
END {print "end-of-report"}' grade.txt
name ID
mary 02/22 1231
end-of-report
而取反的方式是if($1 !~ /mary/)
在awk中组合条件语句与java script很类似,都是使用||或者&& ,这与传统的shell -o 或者 -a 不同。
同时在awk中提供了很多内置变量,可以方便的运用。常用的有以下几个:
NF 域的个数 NR 已读记录的个数 FILENAME表示文件名
例如:
Java代码
[chenwu@localhost unit9-awkIntroduce]$ awk '{print NF,NR,$0} END{print FILENAME}' grade.txt
3 1 chenwu 05/99 4811
3 2 mary 02/22 1231
3 3 tom 09/15 1182
grade.txt
[java]
[chenwu@localhost unit9-awkIntroduce]$ awk '{print NF,NR,$0} END{print FILENAME}' grade.txt
3 1 chenwu 05/99 4811
3 2 mary 02/22 1231
3 3 tom 09/15 1182
grade.txt
awk中域值的比较操作有以下两种方式:
第一种方式,直接在条件表达式里硬编码:
例如,想查看所有得分在27分以下的同学:
Java代码
[chenwu@localhost unit9-awkIntroduce]$ cat grade.txt
chenwu 05/99 4811 27
mary 02/22 1231 30
tom 09/15 1182 25
[chenwu@localhost unit9-awkIntroduce]$ awk '{if($4<27) print $0}' grade.txt
tom 09/15 1182 25
[java]
[chenwu@localhost unit9-awkIntroduce]$ cat grade.txt
chenwu 05/99 4811 27
mary 02/22 1231 30
tom 09/15 1182 25
[chenwu@localhost unit9-awkIntroduce]$ awk '{if($4<27) print $0}' grade.txt
tom 09/15 1182 25
这里还有第二种方式,在BEGIN模块里定义变量,从而可以提高内聚性。例如:
Java代码
[chenwu@localhost unit9-awkIntroduce]$ awk 'BEGIN {baseline=27} {if($4
tom 09/15 1182 25
[java]
[chenwu@localhost unit9-awkIntroduce]$ awk 'BEGIN {baseline=27} {if($4
tom 09/15 1182 25
注意这里取变量的时候,不能加上$符号,如果不小心加上$baseline,那么什么都不会输出了:
Java代码
[chenwu@localhost unit9-awkIntroduce]$ awk 'BEGIN {baseline=27} {if($4<$baseline) print $0}' grade.txt
[chenwu@localhost unit9-awkIntroduce]
[java]
[chenwu@localhost unit9-awkIntroduce]$ awk 'BEGIN {baseline=27} {if($4<$baseline) print $0}' grade.txt
[chenwu@localhost unit9-awkIntroduce]
如果只是想统计某一列的总和等,则应该这样做:
Java代码
[chenwu@localhost unit9-awkIntroduce]$ awk '{total+=$4} END {print "total scores are "total}' grade.txt
total scores are 82
[java]
[chenwu@localhost unit9-awkIntroduce]$ awk '{total+=$4} END {print "total scores are "total}' grade.txt
total scores are 82
再例如,只查找所有普通文件的长度总和(非目录)。可以参考下面的方式:
Java代码
[chenwu@localhost unit9-awkIntroduce]$ ls -l | awk 'BEGIN {total=0} {if($1~/^[^d]/) total+=$5;print $0}
END {print "total size:"total}'
总计 12
-rw-rw-r-- 1 chenwu chenwu 53 06-10 10:16 grade.report
-rw-rw-r-- 1 chenwu chenwu 64 06-11 10:12 grade.txt
drwxrwxr-x 2 chenwu chenwu 4096 06-11 10:28 testDir
total size:117
[java]
[chenwu@localhost unit9-awkIntroduce]$ ls -l | awk 'BEGIN {total=0} {if($1~/^[^d]/) total+=$5;print $0}
END {print "total size:"total}'
总计 12
-rw-rw-r-- 1 chenwu chenwu 53 06-10 10:16 grade.report
-rw-rw-r-- 1 chenwu chenwu 64 06-11 10:12 grade.txt
drwxrwxr-x 2 chenwu chenwu 4096 06-11 10:28 testDir
total size:117
当然也可以将if($1 ~/^[^d]/) 换成if($1 ! ~ /^d/),例如:
Java代码
[chenwu@localhost unit9-awkIntroduce]$ ls -l | awk 'BEGIN {total=0} {if($1!~/^d/) total+=$5;print $0}
END {print "total size:"total}'
总计 12
-rw-rw-r-- 1 chenwu chenwu 53 06-10 10:16 grade.report