您的位置:首页 > 运维架构 > Linux

linux学习之linux百问4,awk了解

2013-05-14 20:54 309 查看
1、awk

sed
以行为单位处理文件,
awk
sed
强的地方在于不仅能以行为单位还能以列为单位处理文件。
awk
缺省的行分隔符是换行,缺省的列分隔符是连续的空格和Tab,但是行分隔符和列分隔符都可以自定义,比如
/etc/passwd
文件的每一行有若干个字段,字段之间以
:
分隔,就可以重新定义
awk
的列分隔符为
:
并以列为单位处理这个文件。
awk
实际上是一门很复杂的脚本语言,还有像C语言一样的分支和循环结构,但是基本用法和
sed
类似,
awk
命令行的基本形式为:
awk option 'script' file1 file2 ...
awk option -f scriptfile file1 file2 ...

sed
一样,
awk
处理的文件既可以由标准输入重定向得到,也可以当命令行参数传入,编辑命令可以直接当命令行参数传入,也可以用
-f
参数指定一个脚本文件,编辑命令的格式为:
/pattern/{actions}
condition{actions}

sed
类似,
pattern
是正则表达式,
actions
是一系列操作。
awk
程序一行一行读出待处理文件,如果某一行与
pattern
匹配,或者满足
condition
条件,则执行相应的
actions
,如果一条
awk
命令只有
actions
部分,则
actions
作用于待处理文件的每一行。比如文件
testfile
的内容表示某商店的库存量:
ProductA  30
ProductB  76
ProductC  55

打印每一行的第二列:
$ awk '{print $2;}' testfile
30
76
55

自动变量
$1
$2
分别表示第一列、第二列等,类似于Shell脚本的位置参数,而
$0
表示整个当前行。再比如,如果某种产品的库存量低于75则在行末标注需要订货:
$ awk '$2<75 {printf "%s\t%s\n", $0, "REORDER";} $2>=75 {print $0;}' testfile
ProductA  30    REORDER
ProductB  76
ProductC  55    REORDER

可见
awk
也有和C语言非常相似的
printf
函数。
awk
命令的
condition
部分还可以是两个特殊的
condition
BEGIN
END
,对于每个待处理文件,
BEGIN
后面的
actions
在处理整个文件之前执行一次,
END
后面的
actions
在整个文件处理完之后执行一次。
awk
命令可以像C语言一样使用变量(但不需要定义变量),比如统计一个文件中的空行数
$ awk '/^ *$/ {x=x+1;} END {print x;}' testfile

就像Shell的环境变量一样,有些
awk
变量是预定义的有特殊含义的:

awk常用的内建变量

FILENAME当前输入文件的文件名,该变量是只读的
NR当前行的行号,该变量是只读的,
R
代表record
NF当前行所拥有的列数,该变量是只读的,
F
代表field
OFS输出格式的列分隔符,缺省是空格
FS输入文件的列分融符,缺省是连续的空格和Tab
ORS输出格式的行分隔符,缺省是换行符
RS输入文件的行分隔符,缺省是换行符
例如打印系统中的用户帐号列表
$ awk 'BEGIN {FS=":"} {print $1;}' /etc/passwd

awk
还可以像C语言一样使用
if
/
else
while
for
控制结构,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: