s u b s t r的另一种形式是返回字符串后缀或指定位置后面字符。这里需要给出指定字符串及
其返回字串的起始位置。例如,从文本文件中抽取姓氏,需操作域1,并从第三个字符开始: [iyunv@localhost huangcd]# awk '{print substr($1,3)}' grade.txt
Tansley
Lulu
Bunny
Troll
Tansley
还有一个例子,在B E G I N部分定义字符串,在E N D部分返回从第t个字符开始抽取的子
串。
[iyunv@localhost huangcd]# awk 'BEGIN {STR="A FEN GOOD MEN"} END {print substr(STR,7)}' grade.txt
GOOD MEN
使用管道将字符串s t a n d - b y传入a w k,返回其长度。
[iyunv@localhost huangcd]# echo "Stand-by"|awk '{print length($0)}'
8
设置文件名为一变量,管道输出到a w k,返回不带扩展名的文件名。
[iyunv@localhost huangcd]# STR="gSSDFFDSW.txt"
[iyunv@localhost huangcd]# echo $STR|awk '{print substr($STR,1,5)}'
gSSDF
如果使用正则表达式,查询花括号( { }),在字符前加反斜线,如/ \ { /,将在a w k中失掉其
特殊含义。
使用上述符号,打印May Day,中间夹t a b键,后跟两个新行,再打印May Day,但这次
使用八进制数1 0 4、1 4 1、1 7 1、分别代表D、a、y。
[iyunv@localhost huangcd]# awk 'BEGIN {print "\nMay\tDay\n\nMay \104\141\171"}'
May Day
May Day
目前为止,所有例子的输出都是直接到屏幕,除了t a b键以外没有任何格式。a w k提供函
数p r i n t f,拥有几种不同的格式化输出功能。例如按列输出、左对齐或右对齐方式。
每一种p r i n t f函数(格式控制字符)都以一个%符号开始,以一个决定转换的字符结束。
转换包含三种修饰符。
p r i n t f函数基本语法是p r i n t f([格式控制符],参数),格式控制字符通常在引号里。
[iyunv@localhost huangcd]# echo "65" |awk '{printf "%c\n",$0}'
A
[iyunv@localhost huangcd]# awk 'BEGIN {printf "%c\n",65}'
A
[iyunv@localhost huangcd]# awk 'BEGIN {printf "%f\n",999}'
999.000000
打印所有的学生名字和序列号,要求名字左对齐, 1 5个字符长度,后跟序列号。注意\ n
换行符放在最后一个指示符后面。输出将自动分成两列。
[iyunv@localhost huangcd]# awk '{printf "%-15s %s\n",$1,$3}' grade.txt
M.Tansley 48311
J.Lulu 48317
P.Bunny 48
J.Troll 4842
L.Tansley 4712
在查看a w k脚本前,先来查看怎样在a w k命令行中传递变量。
在a w k执行前将值传入a w k变量,需要将变量放在命令行中,格式如下:
awk 命令变量=输入文件值
(后面会讲到怎样传递变量到a w k脚本中)。
下面的例子在命令行中设置变量A G E等于1 0,然后传入a w k中,查询年龄在1 0岁以下的
所有学生。
[iyunv@localhost huangcd]# awk '{if($5<AGE) print $0}' AGE=10 grade.txt
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
要快速查看文件系统空间容量,观察其是否达到一定水平,可使用下面a w k一行脚本。因
为要监视的已使用空间容量不断在变化,可以在命令行指定一个触发值。首先用管道命令将
df -k 传入a w k,然后抽出第4列,即剩余可利用空间容量。使用$ 4 ~ / ^ [ 0 - 9 ] /取得容量数值
(1 0 2 4块)而不是d f的文件头,然后对命令行与‘ i f ( $ 4 < T R I G G E R )’上变量T R I G G E R中指定
的值进行查询测试。
[iyunv@localhost huangcd]# df -k|awk '($4~/^[0-9]/) {if($4<TRIGGER) print $6"\t"$4}' TRIGGER=560000
/dev/shm 517276
|