Linux awk
注意:
• 确保整个a w k命令用单引号括起来。
• 确保命令内所有引号成对出现。
• 确保用花括号括起动作语句,用圆括号括起条件语句。
• 可能忘记使用花括号,也许你认为没有必要,但 a w k不这样认为,将按之解释语法。
bldr:deyuy/bin/my_shell >> ls -l |grep ".sh" | tee cache-rwxrw-r-- 1 deyuy deyuy 252 Jan 12 23:40 case.sh -rwxrw-r-- 1 deyuy deyuy 161 Jan 12 02:44 for1.sh -rw-rw-r-- 1 deyuy deyuy 147 Jan 12 01:57 for2.sh -rw-rw-r-- 1 deyuy deyuy 227 Jan 12 02:04 for3.sh -rwxrw-r-- 1 deyuy deyuy 267 Jan 12 22:57 for4.sh -rwxrw-r-- 1 deyuy deyuy 245 Jan 12 20:12 for5.sh -rwxrw-r-- 1 deyuy deyuy 530 Jan 12 20:53 for6.sh -rw-rw-r-- 1 deyuy deyuy 385 Dec 30 22:30 fun1.sh -rwxrwxr-x 1 deyuy deyuy 164 Dec 29 02:34 hello.sh -rwxr-xr-- 1 deyuy deyuy 177 Jan 6 18:49 hh.sh -rw-rw-r-- 1 deyuy deyuy 312 Jan 6 02:23 if.sh -rw-rw-r-- 1 deyuy deyuy 313 Jan 6 02:48 if2.sh -rwxrw-r-- 1 deyuy deyuy 450 Jan 12 23:35 select.sh -rwxr-xr-x 1 deyuy deyuy 351 Jan 5 21:11 test.sh -rwxrw-r-- 1 deyuy deyuy 295 Jan 5 00:07 test2.sh -rw-rw-r-- 1 deyuy deyuy 263 Jan 12 23:06 until.sh -rwxr-xr-x 1 deyuy deyuy 608 Jan 4 02:12 var.sh -rwxrw-r-- 1 deyuy deyuy 182 Jan 7 20:35 while1.sh
此文本文件有9个域,即(1)文件属性、(2)文件硬链接数或目录子目录数、(3)文件拥有者、(4)、文件所属组、(5)文件大小、(6)修改时间-月、
(7)修改时间-日、(8)修改时间-时:分、(9)文件名字。
因为域间使用空格作为域分隔符,故不必用 - F选项划分域,现浏览文件并导出一些数据。
2. 保存a w k输出
有两种方式保存 s h e l l提示符下a w k脚本的输出。最简单的方式是使用输出重定向符号 >文件名,下面的例子重定向输出到文件 awk.txt。
deyuy/bin/my_shell >> awk '{print $0}' cache > awk.txt
使用这种方法要注意,显示屏上不会显示输出结果,因为它直接输出到文件,只有在保证输出结果正确时才会使用这种方法,它也会重写硬盘上同名数据。
第二种方法是使用 t e e命令,在输出到文件的同时输出到屏幕。在测试输出结果正确与否时多使用这种方法。例如输出重定向到文件awk.txt,同时输出到屏幕。使用这种方法,在a w k命令结尾写入 | awk.txt。
deyuy/bin/my_shell >> awk '{print $0}' cache |tee awk.txt -rwxrw-r-- 1 deyuy deyuy 252 Jan 12 23:40 case.sh -rwxrw-r-- 1 deyuy deyuy 161 Jan 12 02:44 for1.sh -rw-rw-r-- 1 deyuy deyuy 147 Jan 12 01:57 for2.sh -rw-rw-r-- 1 deyuy deyuy 227 Jan 12 02:04 for3.sh -rwxrw-r-- 1 deyuy deyuy 267 Jan 12 22:57 for4.sh -rwxrw-r-- 1 deyuy deyuy 245 Jan 12 20:12 for5.sh -rwxrw-r-- 1 deyuy deyuy 530 Jan 12 20:53 for6.sh -rw-rw-r-- 1 deyuy deyuy 385 Dec 30 22:30 fun1.sh -rwxrwxr-x 1 deyuy deyuy 164 Dec 29 02:34 hello.sh -rwxr-xr-- 1 deyuy deyuy 177 Jan 6 18:49 hh.sh -rw-rw-r-- 1 deyuy deyuy 312 Jan 6 02:23 if.sh -rw-rw-r-- 1 deyuy deyuy 313 Jan 6 02:48 if2.sh -rwxrw-r-- 1 deyuy deyuy 450 Jan 12 23:35 select.sh -rwxr-xr-x 1 deyuy deyuy 351 Jan 5 21:11 test.sh -rwxrw-r-- 1 deyuy deyuy 295 Jan 5 00:07 test2.sh -rw-rw-r-- 1 deyuy deyuy 263 Jan 12 23:06 until.sh -rwxr-xr-x 1 deyuy deyuy 608 Jan 4 02:12 var.sh -rwxrw-r-- 1 deyuy deyuy 182 Jan 7 20:35 while1.sh
打印单独记录
假定只打印学生名字和腰带级别,通过查看域所在列,可知为 f i e l d - 1和f i e l d - 4,因此可以
使用$ 1和$ 4,但不要忘了加逗号以分隔域。
:deyuy/bin/my_shell >> awk '{print $1,$3,$5,$9}' awk.txt -rwxrw-r-- deyuy 252 case.sh -rwxrw-r-- deyuy 161 for1.sh -rw-rw-r-- deyuy 147 for2.sh -rw-rw-r-- deyuy 227 for3.sh -rwxrw-r-- deyuy 267 for4.sh -rwxrw-r-- deyuy 245 for5.sh -rwxrw-r-- deyuy 530 for6.sh -rw-rw-r-- deyuy 385 fun1.sh -rwxrwxr-x deyuy 164 hello.sh -rwxr-xr-- deyuy 177 hh.sh -rw-rw-r-- deyuy 312 if.sh -rw-rw-r-- deyuy 313 if2.sh -rwxrw-r-- deyuy 450 select.sh -rwxr-xr-x deyuy 351 test.sh -rwxrw-r-- deyuy 295 test2.sh -rw-rw-r-- deyuy 263 until.sh -rwxr-xr-x deyuy 608 var.sh -rwxrw-r-- deyuy 182 while1.sh
打印报告头
上述命令输出在名字和腰带级别之间用一些空格使之更容易划分,也可以在域间使用 t a b
键加以划分。为加入t a b键,使用t a b键速记引用符 \ t,后面将对速记引用加以详细讨论。也可
以为输出文本加入信息头。本例中加入 n a m e和b e l t及下划线。下划线使用 \ n,强迫启动新行,
并在\ n下一行启动打印文本操作。打印信息头放置在 B E G I N模式部分,因为打印信息头被界
定为一个动作,必须用大括号括起来。在 a w k查看第一条记录前,信息头被打印。
awk 'BEGIN {print "Attribute User Size Name\n-------------------------------------------"}{print $1"\t"$3"\t"$5"\t"$9}' awk.txt Attribute User Size Name ------------------------------------------- -rwxrw-r-- deyuy 252 case.sh -rwxrw-r-- deyuy 161 for1.sh -rw-rw-r-- deyuy 147 for2.sh -rw-rw-r-- deyuy 227 for3.sh -rwxrw-r-- deyuy 267 for4.sh -rwxrw-r-- deyuy 245 for5.sh -rwxrw-r-- deyuy 530 for6.sh -rw-rw-r-- deyuy 385 fun1.sh -rwxrwxr-x deyuy 164 hello.sh -rwxr-xr-- deyuy 177 hh.sh -rw-rw-r-- deyuy 312 if.sh -rw-rw-r-- deyuy 313 if2.sh -rwxrw-r-- deyuy 450 select.sh -rwxr-xr-x deyuy 351 test.sh -rwxrw-r-- deyuy 295 test2.sh -rw-rw-r-- deyuy 263 until.sh -rwxr-xr-x deyuy 608 var.sh -rwxrw-r-- deyuy 182 while1.sh
7. 打印信息尾
如果在末行加入end of report信息,可使用E N D语句。E N D语句在所有文本处理动作执行
完之后才被执行。 E N D语句在脚本中的位置放置在主要动作之后。下面简单打印头信息并告
之查询动作完成。
awk 'BEGIN {print "Attribute User Size Name\n-------------------------------------------"}{print $1"\t"$3"\t"$5"\t"$9}END{print "-------------------------------------------"}' awk.txt Attribute User Size Name ------------------------------------------- -rwxrw-r-- deyuy 252 case.sh -rwxrw-r-- deyuy 161 for1.sh -rw-rw-r-- deyuy 147 for2.sh -rw-rw-r-- deyuy 227 for3.sh -rwxrw-r-- deyuy 267 for4.sh -rwxrw-r-- deyuy 245 for5.sh -rwxrw-r-- deyuy 530 for6.sh -rw-rw-r-- deyuy 385 fun1.sh -rwxrwxr-x deyuy 164 hello.sh -rwxr-xr-- deyuy 177 hh.sh -rw-rw-r-- deyuy 312 if.sh -rw-rw-r-- deyuy 313 if2.sh -rwxrw-r-- deyuy 450 select.sh -rwxr-xr-x deyuy 351 test.sh -rwxrw-r-- deyuy 295 test2.sh -rw-rw-r-- deyuy 263 until.sh -rwxr-xr-x deyuy 608 var.sh -rwxrw-r-- deyuy 182 while1.sh -------------------------------------------

浙公网安备 33010602011771号