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
-------------------------------------------

 



posted @ 2015-04-14 15:44  mooncreek  阅读(87)  评论(0)    收藏  举报