文档库 最新最全的文档下载
当前位置:文档库 › awk用法

awk用法

awk用法
awk用法

下面没有讲述a w k的全部特性,也不涉及a w k的深层次编程,仅讲述使用a w k执行行操作及怎样从文本文件和字符串中抽取信息。

QUOTE:

内容有:

" 抽取域。

" 匹配正则表达式。

" 比较域。

" 向a w k传递参数。

" 基本的a w k行操作和脚本。

a w k语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息。a w k抽取信息后,才能进行其他文本操作。完整的a w k脚本通常用来格式化文本文件中的信息。

1 调用awk

有三种方式调用a w k,第一种是命令行方式,如:

[Copy to clipboard][ - ] CODE:

awk [-F fild-separator] 'commands' input-file(s)

这里,c o m m a n d s是真正的a w k命令。

上面例子中,[ - F域分隔符]是可选的,因为a w k使用空格作为缺省的域分隔符,因此如果要浏览域间有空格的文本,不必指定这个选项,但如果要浏览诸如p a s s w d文件,此文件各域以冒号作为分隔符,则必须指明- F选项,如:

[Copy to clipboard][ - ] CODE:

awk -F: 'commands' input-file(s)

第二种方法是将所有a w k命令插入一个文件,并使a w k程序可执行,然后用a w k命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。

第三种方式是将所有的a w k命令插入一个单独文件,然后调用:

[Copy to clipboard][ - ] CODE:

awk -f awk-script-file input-files(s)

- f选项指明在文件a w k _ s c r i p t _ f i l e中的a w k脚本,i n p u t _ f i l e ( s )是使用a w k进行浏览的文件名。

2 awk脚本

在命令中调用a w k时,a w k脚本由各种操作和模式组成。

如果设置了- F选项,则a w k每次读一条记录或一行,并使用指定的分隔符分隔指定域,但如果未设置- F选项,a w k 假定空格为域分隔符,并保持这个设置直到发现一新行。当新行出现时,a w k命令获悉已读完整条记录,然后在下一个记录启动读命令,这个读进程将持续到文件尾或文件不再存在。

参照表,a w k每次在文件中读一行,找到域分隔符(这里是符号#),设置其为域n,直至一新行(这里是缺省记录分隔符),然后,划分这一行作为一条记录,接着a w k再次启动下一行读进程。

awk读文件记录的方式

QUOTE:

域1 分隔符域2 分隔符域3 分隔符域4及换行

P. B u n n y (记录1 ) # 0 2 / 9 9 # 4 8 # Yellow \n

J . Tr o l l (记录2 ) # 0 7 / 9 9 # 4 8 4 2 # Brown-3 \n

2.1 模式和动作

任何a w k语句都由模式和动作组成。在一个a w k脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式部分,动作将时刻保持执行状态。

模式可以是任何条件语句或复合语句或正则表达式。模式包括两个特殊字段B E G I N和E N D。使用B E G I N语句设置计数和打印头。B E G I N语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行。E N D语句用来在a w k完成文本浏览动作后打印输出文本总数和结尾状态标志。如果不特别指明模式, a w k总是匹配或打印行数。实际动作在大括号{ }内指明。动作大多数用来打印,但是还有些更长的代码诸如i f和循环(l o o p i n g)语句及循环退出结构。如果不指明采取动作, a w k将打印出所有浏览出来的记录。

shell基础九:awk

2. 域和记录

a w k执行时,其浏览域标记为$ 1,$ 2 . . . $ n。这种方法称为域标识。使用这些域标识将更容易对域进行进一步处理。使用$ 1 , $ 3表示参照第1和第3域,注意这里用逗号做域分隔。如果希望打印一个有5个域的记录的所有域,不必指明$ 1 , $ 2 , $ 3 , $ 4 , $ 5,可使用$ 0,意即所有域。Aw k浏览时,到达一新行,即假定到达包含域的记录末尾,然后执行新记录下一行的读动作,并重新设置域分隔。

注意执行时不要混淆符号$和s h e l l提示符$,它们是不同的。

为打印一个域或所有域,使用p r i n t命令。这是一个a w k动作(动作语法用圆括号括起来)。

1. 抽取域

真正执行前看几个例子,现有一文本文件g r a d e . t x t,记录了一个称为柔道数据库的行信息。

[Copy to clipboard][ - ] CODE:

$ cat grade.txt

M.Tans 5/99 48311 Green 8 40 44

J.Lulu 06/99 48317 green 9 24 26

P.Bunny 02/99 48 Yellow 12 35 28

J.Troll 07/99 4842 Brown-3 12 26 26

L.Tansl 05/99 4712 Brown-2 12 30 28

此文本文件有7个域,即(1)名字、(2)升段日期、(3)学生序号、(4)腰带级别、(5)年龄、(6)目前比赛积分、(7)比赛最高分。

因为域间使用空格作为域分隔符,故不必用- F选项划分域,现浏览文件并导出一些数据。在例子中为了利于显示,将空格加宽使各域看得更清晰。

2. 保存a w k输出

有两种方式保存s h e l l提示符下a w k脚本的输出。最简单的方式是使用输出重定向符号>文件名,下面的例子重定向输出到文件w o w。

[Copy to clipboard][ - ] CODE:

$ awk '{print $0}' grade.txt >wow

$ cat grade.txt

使用这种方法要注意,显示屏上不会显示输出结果。因为它直接输出到文件。只有在保证输出结果正确时才会使用这种方法。它也会重写硬盘上同名数据。

第二种方法是使用t e e命令,在输出到文件的同时输出到屏幕。在测试输出结果正确与否时多使用这种方法。例如输出重定向到文件d e l e t e _ m e _ a n d _ d i e,同时输出到屏幕。使用这种方法,在a w k命令结尾写入| tee

delete_me_and_die。

[Copy to clipboard][ - ] CODE:

$ awk '{print $0}' grade.txt | tee delete_me_and_die

3. 使用标准输入

在深入讲解这一章之前,先对a w k脚本的输入方法简要介绍一下。实际上任何脚本都是从标准输入中接受输入的。为运行本章脚本,使用a w k脚本输入文件格式,例如:

QUOTE:

belts.awk grade_student.txt

也可替代使用下述格式:

使用重定向方法:

belts.awk < grade2.txt

或管道方法:

grade2.txt | belts.awk

这里我怎么看不明白,汗

4. 打印所有记录

[Copy to clipboard][ - ] CODE:

$ awk '{print $0}' grade.txt

a w k读每一条记录。因为没有模式部分,只有动作部分{print $0}(打印所有记录),这个动作必须用花括号括起来。上述命令打印整个文件。

5. 打印单独记录

假定只打印学生名字和腰带级别,通过查看域所在列,可知为f i e l d - 1和f i e l d - 4,因此可以使用$ 1和$ 4,但不要忘了加逗号以分隔域。

[Copy to clipboard][ - ] CODE:

$ awk '{print $1,$4}' grade.txt

M.Tans Green

J.Lulu green

P.Bunny Yellow

J.Troll Brown-3

L.Tansl Brown-2

6. 打印报告头

上述命令输出在名字和腰带级别之间用一些空格使之更容易划分,也可以在域间使用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查看第一条记录前,信息头被打印。

[Copy to clipboard][ - ] CODE:

$ awk 'BEGIN {print "Name Belt\n-----------------------------------"}{print $1"\t",$4}' grade.txt

Name Belt

-----------------------------------

M.Tans Green

J.Lulu green

P.Bunny Yellow

J.Troll Brown-3

L.Tansl Brown-2

7. 打印信息尾

如果在末行加入end of report信息,可使用E N D语句。E N D语句在所有文本处理动作执行完之后才被执行。E N D 语句在脚本中的位置放置在主要动作之后。下面简单打印头信息并告之查询动作完成。

[Copy to clipboard][ - ] CODE:

$ awk 'BEGIN {print "Name\n--------"}{print $1} END {print "end-of-report"}' grade.txt

Name

--------

M.Tans

J.Lulu

P.Bunny

J.Troll

L.Tansl

8. awk错误信息提示

几乎可以肯定,在使用a w k时,将会在命令中碰到一些错误。a w k将试图打印错误行,但由于大部分命令都只在一行,因此帮助不大。

系统给出的显示错误信息提示可读性不好。使用上述例子,如果丢了一个双引号, a w k将返回:

[Copy to clipboard][ - ] CODE:

$ awk 'BEGIN {print "Name\n--------}{print $1} END {"end-of-report"}' grade.txt

awk: cmd. line:1: BEGIN {print "Name\n--------}{print $1} END {"end-of-report"}

awk: cmd. line:1: ^ unterminated string

当第一次使用a w k时,可能被错误信息搅得不知所措,但通过长时间和不断的学习,可总结出以下规则。在碰到a w k

错误时,可相应查找:

QUOTE:

" 确保整个a w k命令用单引号括起来。

" 确保命令内所有引号成对出现。

" 确保用花括号括起动作语句,用圆括号括起条件语句。

" 可能忘记使用花括号,也许你认为没有必要,但a w k不这样认为,将按之解释语法

如果查询文件不存在,将得到下述错误信息:

[Copy to clipboard][ - ] CODE:

$ awk 'END {print NR}' grades.txt

awk: cmd. line:2: fatal: cannot open file `grades.txt' for reading (没有那个文件或目录)

9.awk 键盘输入

如果在命令行并没有输入文件g r a d e . t x t,将会怎样?

[Copy to clipboard][ - ] CODE:

$ awk 'BEGIN {print "Name\n--------"}{print $1} END {"end-of-report"}'

Name

--------

B E G I N部分打印了文件头,但a w k最终停止操作并等待,并没有返回s h e l l提示符。这是因为a w k期望获得键盘输入。因为没有给出输入文件,a w k假定下面将会给出。如果愿意,顺序输入相关文本,并在输入完成后敲键。如果敲入了正确的域分隔符, a w k会像第一个例子一样正常处理文本。这种处理并不常用,因为它大多应用于大量的打印稿。

2.3awk中正则表达式及其操作

在g r e p一章中,有许多例子用到正则表达式,这里将不使用同样的例子,但可以使用条件操作讲述a w k中正则表达式的用法。

这里正则表达式用斜线括起来。例如,在文本文件中查询字符串G r e e n,使用/ G r e e n /可以查出单词G r e e n的出现情况。

2.4元字符

这里是a w k中正则表达式匹配操作中经常用到的字符,详细情况请参阅本书第7章正则表达式概述。

[Copy to clipboard][ - ] CODE:

\ ^ $ . [] | () * + ?

这里有两个字符第7章没有讲到,因为它们只适用于a w k而不适用于g r e p或s e d。它们是:

QUOTE:

+ 使用+匹配一个或多个字符。

?匹配模式出现频率。例如使用/X Y?Z/匹配X Y Z或Y Z。

shell基础九:awk

条件操作符

a w k条件操作符

操作符描述操作符描述

< 小于> = 大于等于

< = 小于等于~ 匹配正则表达式

= = 等于!~ 不匹配正则表达式

!= 不等于

1. 匹配

为使一域号匹配正则表达式,使用符号…~?后紧跟正则表达式,也可以用i f语句。a w k中i f后面的条件用()括起来。观察文件g r a d e . t x t,如果只要显示b r o w n腰带级别可知其所在域为f i e l d - 4,这样可以写出表达式

{if($4~/brown/) print }意即如果f i e l d - 4包含b r o w n,打印它。如果条件满足,则打印匹配记录行。可以编写下面脚本,因为这是一个动作,必须用花括号{ }括起来。

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '{if($4~/Brown/) print $0}' grade.txt

J.Troll 07/99 4842 Brown-3 12 26 26

L.Tansl 05/99 4712 Brown-2 12 30 28

匹配记录找到时,如果不特别声明, a w k缺省打印整条记录。使用i f语句开始有点难,但不要着急,因为有许多方法可以跳过它,并仍保持同样结果。下面例子意即如果记录包含模式b r o w n,就打印它:

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '$0 ~ /Brown/' grade.txt

J.Troll 07/99 4842 Brown-3 12 26 26

L.Tansl 05/99 4712 Brown-2 12 30 28

2. 精确匹配

假定要使字符串精确匹配,比如说查看学生序号4 8,文件中有许多学生序号包含4 8,如果在f i e l d - 3中查询序号4 8,a w k将返回所有序号带4 8的记录:

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '{if($3~/48/) print$0}' grade.txt

M.Tans 5/99 48311 Green 8 40 44

J.Lulu 06/99 48317 green 9 24 26

P.Bunny 02/99 48 Yellow 12 35 28

J.Troll 07/99 4842 Brown-3 12 26 26

为精确匹配4 8,使用等号= =,并用单引号括起条件。例如$ 3

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '$3=="48" {print$0}' grade.txt

P.Bunny 02/99 48 Yellow 12 35 28

[root@Linux_chenwy sam]# awk '{if($3=="48") print$0}' grade.txt

P.Bunny 02/99 48 Yellow 12 35 28

3. 不匹配

有时要浏览信息并抽取不匹配操作的记录,与~相反的符号是!~,意即不匹配。像原来使用查询b r o w n腰带级别的匹配操作一样,现在看看不匹配情况。表达式$0 !~/brown/,意即查询不包含模式b r o w n腰带级别的记录并打印它。

注意,缺省情况下, a w k将打印所有匹配记录,因此这里不必加入动作部分。

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '$0 !~ /Brown/' grade.txt

M.Tans 5/99 48311 Green 8 40 44

J.Lulu 06/99 48317 green 9 24 26

P.Bunny 02/99 48 Yellow 12 35 28

可以只对f i e l d - 4进行不匹配操作,方法如下:

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '{if($4~/Brown/) print $0}' grade.txt

J.Troll 07/99 4842 Brown-3 12 26 26

L.Tansl 05/99 4712 Brown-2 12 30 28

如果只使用命令awk$4 !="brown"{print $0} grade.txt,将返回错误结果,因为用引号括起了b r o w n,将只匹配…b r o w n而不匹配b r o w n - 2和b r o w n - 3,当然,如果想要查询非b r o w n - 2的腰带级别,可做如下操作:

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '$4!="Brown-2" {print $0}' grade.txt

M.Tans 5/99 48311 Green 8 40 44

J.Lulu 06/99 48317 green 9 24 26

P.Bunny 02/99 48 Yellow 12 35 28

J.Troll 07/99 4842 Brown-3 12 26 26

4. 小于

看看哪些学生可以获得升段机会。测试这一点即判断目前级别分f i e l d - 6是否小于最高分f i e l d - 7,在输出结果中,加入这一改动很容易。

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '{if($6 < $7) print $0}' grade.txt

M.Tans 5/99 48311 Green 8 40 44

J.Lulu 06/99 48317 green 9 24 26

5. 小于等于

对比小于,小于等于只在操作符上做些小改动,满足此条件的记录也包括上面例子中的输出情况。

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '{if($6 <= $7) print $1}' grade.txt

M.Tans

J.Lulu

J.Troll

6. 大于

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '{if($6 > $7) print $1}' grade.txt

P.Bunny

L.Tansl

7. 设置大小写

为查询大小写信息,可使用[ ]符号。在测试正则表达式时提到可匹配[ ]内任意字符或单词,因此若查询文件中级别为g r e e n的所有记录,不论其大小写,表达式应为… / [ G g ] r e e n /?

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '/[Gg]reen/' grade.txt

M.Tans 5/99 48311 Green 8 40 44

J.Lulu 06/99 48317 green 9 24 26

8. 任意字符

抽取名字,其记录第一域的第四个字符是a,使用句点.。表达式/ ^ . . . a /意为行首前三个字符任意,第四个是a,尖角符号代表行首。

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '$1 ~ /^...a/' grade.txt

M.Tans 5/99 48311 Green 8 40 44

L.Tansl 05/99 4712 Brown-2 12 30 28

9. 或关系匹配

为抽取级别为y e l l o w或b r o w n的记录,使用竖线符|。意为匹配| 两边模式之一。注意,使用竖线符时,语句必须用圆括号括起来。

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '$0 ~/(Yellow|Brown)/' grade.txt

P.Bunny 02/99 48 Yellow 12 35 28

J.Troll 07/99 4842 Brown-3 12 26 26

L.Tansl 05/99 4712 Brown-2 12 30 28

上面例子输出所有级别为Ye l l o w或B r o w n的记录。

使用这种方法在查询级别为G r e e n或g r e e n时,可以得到与使用[ ]表达式相同的结果。

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '/^M/' grade.txt

M.Tans 5/99 48311 Green 8 40 44

10. 行首

不必总是使用域号。如果查询文本文件行首包含M的代码,可简单使用下面^符号:

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '/^M/' grade.txt

复合表达式即为模式间通过使用下述各表达式互相结合起来的表达式:

QUOTE:

&& AND : 语句两边必须同时匹配为真。

|| O R:语句两边同时或其中一边匹配为真。

! 非求逆

11. AND

打印记录,使其名字为… P. B u n n y且级别为Ye l l o w,使用表达式( $ 1 = = " P. B u n n y " & &$ 4 = = " Ye l l o w " ),意为& &两边匹配均为真。完整命令如下:

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '{if ($1=="P.Bunny" && $4=="Yellow") print $0}' grade.txt

P.Bunny 02/99 48 Yellow 12 35 28

12. Or

如果查询级别为Ye l l o w或B r o w n,使用或命令。意为“ | |”符号两边的匹配模式之一或全部为真。

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '{if ($4=="Yellow" || $4~/Brown/) print $0}' grade.txt

P.Bunny 02/99 48 Yellow 12 35 28

J.Troll 07/99 4842 Brown-3 12 26 26

L.Tansl 05/99 4712 Brown-2 12 30 28

原来不一定得加print,下面我自己对例一二做了一下

[Copy to clipboard][ - ] CODE:

1

[root@Linux_chenwy sam]# awk '$4~/Brown/' grade.txt

J.Troll 07/99 4842 Brown-3 12 26 26

L.Tansl 05/99 4712 Brown-2 12 30 28

[Copy to clipboard][ - ] CODE:

2

[root@Linux_chenwy sam]# awk '$3=="48"' grade.txt

P.Bunny 02/99 48 Yellow 12 35 28

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '$3="48"' grade.txt

M.Tans 5/99 48 Green 8 40 44

J.Lulu 06/99 48 green 9 24 26

P.Bunny 02/99 48 Yellow 12 35 28

J.Troll 07/99 48 Brown-3 12 26 26

L.Tansl 05/99 48 Brown-2 12 30 28

2中,我把=和==写错了,呵呵,一个是赋值,一个是等于

shell基础九:awk

谢谢烈火,呵呵

awk内置变量

a w k有许多内置变量用来设置环境信息。这些变量可以被改变。表9 - 3显示了最常使用的一些变量,并给出其基本含义。

QUOTE:

awk内置变量

A R G C 命令行参数个数

A R G V 命令行参数排列

E N V I R O N 支持队列中系统环境变量的使用

FILENAME a w k浏览的文件名

F N R 浏览文件的记录数

F S 设置输入域分隔符,等价于命令行- F选项

N F 浏览记录的域个数

N R 已读的记录数

O F S 输出域分隔符

O R S 输出记录分隔符

R S 控制记录分隔符

QUOTE:

A R G C支持命令行中传入a w k脚本的参数个数。A R G V是A R G C的参数排列数组,其中每一元素表示为A R G V [ n ],n为期望访问的命令行参数。

E N V I R O N 支持系统设置的环境变量,要访问单独变量,使用实际变量名,例如E N V I R O N [“E D I TO R”] =“Vi”。

F I L E N A M E支持a w k脚本实际操作的输入文件。因为a w k可以同时处理许多文件,因此如果访问了这个变量,将告之系统目前正在浏览的实际文件。

F N R支持a w k目前操作的记录数。其变量值小于等于N R。如果脚本正在访问许多文件,每一新输入文件都将重新设置此变量。

F S用来在a w k中设置域分隔符,与命令行中- F选项功能相同。缺省情况下为空格。如果用逗号来作域分隔符,设置F S = ","。

N F支持记录域个数,在记录被读之后再设置。

O F S允许指定输出域分隔符,缺省为空格。如果想设置为#,写入O F S = " # "。

O R S为输出记录分隔符,缺省为新行(\ n)。

R S是记录分隔符,缺省为新行( \ n )。

NF、NR和FILENAME

要快速查看记录个数,应使用N R。比如说导出一个数据库文件后,如果想快速浏览记录个数,以便对比于其初始状态,查出导出过程中出现的错误。使用N R将打印输入文件的记录个数。print NR放在E N D语法中。

[Copy to clipboard][ - ] CODE:

[root@chenwy sam]# awk 'END{print NR}' grade.txt

5

如:所有学生记录被打印,并带有其记录号。使用N F变量显示每一条读记录中有多少个域,并在E N D部分打印输入文件名。

[root@chenwy sam]# awk '{print NF,NR,$0} END{print FILENAME}' grade.txt

[Copy to clipboard][ - ] CODE:

7 1 M.Tans 5/99 48311 Green 8 40 44

7 2 J.Lulu 06/99 48317 green 9 24 26

7 3 P.Bunny 02/99 48 Yellow 12 35 28

7 4 J.Troll 07/99 4842 Brown-3 12 26 26

7 5 L.Tansl 05/99 4712 Brown-2 12 30 28

grade.txt

在从文件中抽取信息时,最好首先检查文件中是否有记录。下面的例子只有在文件中至少有一个记录时才查询B r o w n级别记录。使用A N D复合语句实现这一功能。意即至少存在一个记录后,查询字符串B r o w n,最后打印结果。

[Copy to clipboard][ - ] CODE:

[root@chenwy sam]# awk '{if (NR>0 && $4~/Brown/)print $0}' grade.txt

J.Troll 07/99 4842 Brown-3 12 26 26

L.Tansl 05/99 4712 Brown-2 12 30 28

N F的一个强大功能是将变量$ P W D的返回值传入a w k并显示其目录。这里需要指定域分隔符/。

[Copy to clipboard][ - ] CODE:

[root@chenwy sam]# echo $PWD | awk -F/ ' {print $NF}'

sam

另一个例子是显示文件名。

[Copy to clipboard][ - ] CODE:

[root@chenwy sam]# echo "/usr/local/etc/rc.sybase" | awk -F/ '{print $NF}'

rc.sybase

如果不指定域分割符,返回的如下:

[root@chenwy sam]# echo $PWD | awk '{print $NF}'

/usr/sam

[root@chenwy sam]# echo "/usr/local/etc/rc.sybase" | awk '{print $NF}'

/usr/local/etc/rc.sybase

awk操作符

在a w k中使用操作符,基本表达式可以划分为数字型、字符串型、变量型、域及数组元素,前面已经讲过一些。下面列出其完整列表。

在表达式中可以使用下述任何一种操作符。

QUOTE:

= += *= / = %= ^ = 赋值操作符

?条件表达操作符

|| && ! 并、与、非(上一节已讲到)

~!~ 匹配操作符,包括匹配和不匹配

< <= == != >> 关系操作符

+ - * / % ^ 算术操作符

+ + -- 前缀和后缀

前面已经讲到了其中几种操作,下面继续讲述未涉及的部分。

1. 设置输入域到域变量名

在a w k中,设置有意义的域名是一种好习惯,在进行模式匹配或关系操作时更容易理解。

一般的变量名设置方式为n a m e = $ n,这里n a m e为调用的域变量名,n为实际域号。例如设置学生域名为n a m e,级别域名为b e l t,操作为n a m e = $ 1 ; b e l t s = $ 4。注意分号的使用,它分隔a w k命令。下面例子中,重新赋值学生名域为n a m e,级别域为b e l t s。查询级别为Ye l l o w的记录,并最终打印名称和级别。

[Copy to clipboard][ - ] CODE:

[sam@chenwy sam]$ awk '{name=$1;belts=$4;if(belts ~/Yellow/) print name" is belt "belts}' grade.txt

P.Bunny is belt Yellow

2. 域值比较操作

有两种方式测试一数值域是否小于另一数值域。

1) 在B E G I N中给变量名赋值。

2) 在关系操作中使用实际数值。

通常在B E G I N部分赋值是很有益的,可以在a w k表达式进行改动时减少很多麻烦。

使用关系操作必须用圆括号括起来。

下面的例子查询所有比赛中得分在2 7点以下的学生。

用引号将数字引用起来是可选的,“2 7”、2 7产生同样的结果。

[Copy to clipboard][ - ] CODE:

[sam@chenwy sam]$ awk '{if ($6<$7) print $0}' grade.txt

M.Tans 5/99 48311 Green 8 40 44

J.Lulu 06/99 48317 green 9 24 26

第二个例子中给数字赋以变量名B A S E L I N E和在B E G I N部分给变量赋值,两者意义相同。

[sam@chenwy sam]$ awk 'BEGIN{BASELINE="27"} {if ($6

J.Lulu 06/99 48317 green 9 24 26

J.Troll 07/99 4842 Brown-3 12 26 26

3. 修改数值域取值

当在a w k中修改任何域时,重要的一点是要记住实际输入文件是不可修改的,修改的只是保存在缓存里的a w k复本。a w k会在变量N R或N F变量中反映出修改痕迹。

为修改数值域,简单的给域标识重赋新值,如:$ 1 = $ 1 + 5,会将域1数值加5,但要确保赋值域其子集为数值型。修改M . Ta n s l e y的目前级别分域,使其数值从4 0减为3 9,使用赋值语句$ 6 = $ 6 - 1,当然在实施修改前首先要匹配域名。

[Copy to clipboard][ - ] CODE:

[sam@chenwy sam]$ awk '{if($1=="M.Tans") {$6=$6-1};print $1,$6,$7}' grade.txt

M.Tans 39 44

J.Lulu 24 26

P.Bunny 35 28

J.Troll 26 26

L.Tansl 30 28

[Copy to clipboard][ - ] CODE:

[sam@chenwy sam]$ awk '{if($1=="M.Tans") {$6=$6-1;print $1,$6,$7}}' grade.txt

M.Tans 39 44

4. 修改文本域

修改文本域即对其重新赋值。需要做的就是赋给一个新的字符串。在J . Tr o l l中加入字母,使其成为J . L . Tr o l l,表达式为$ 1 = " J . L . Tr o l l ",记住字符串要使用双秒号(" "),并用圆括号括起整个语法。

[Copy to clipboard][ - ] CODE:

[sam@chenwy sam]$ awk '{if($1=="J.Troll") $1="J.L.Troll"; print $1}' grade.txt

M.Tans

J.Lulu

P.Bunny

J.L.Troll

L.Tansl

5. 只显示修改记录

上述例子均是对一个小文件的域进行修改,因此打印出所有记录查看修改部分不成问题,但如果文件很大,记录甚至超过1 0 0,打印所有记录只为查看修改部分显然不合情理。在模式后面使用花括号将只打印修改部分。取得模式,再根据模式结果实施操作,可能有些抽象,现举一例,只打印修改部分。注意花括号的位置。

[Copy to clipboard][ - ] CODE:

[sam@chenwy sam]$ awk '{if($1=="J.Troll") {$1="J.L.Troll"; print $1}}' grade.txt

J.L.Troll

不知道为什么,我这里多了一个空行?

6. 创建新的输出域

在a w k中处理数据时,基于各域进行计算时创建新域是一种好习惯。创建新域要通过其他域赋予新域标识符。如创建一个基于其他域的加法新域{ $ 4 = $ 2 + $ 3 },这里假定记录包含3个域,则域4为新建域,保存域2和域3相加结果。在文件g r a d e . t x t中创建新域8保存域目前级别分与域最高级别分的减法值。表达式为…{ $ 8 = $ 7 - $ 6 }?,语法首先测试域目前级别分小于域最高级别分。新域因此只打印其值大于零的学生名称及其新域值。在B E G I N部分加入t a b 键以对齐报告头。

[Copy to clipboard][ - ] CODE:

[sam@chenwy sam]$ awk 'BEGIN{print "Name\tDifference"}{if($6<$7) {$8=$7-$6;print $1,$8}}' grade.txt

Name Difference

M.Tans 4

J.Lulu 2

当然可以创建新域,并赋给其更有意义的变量名。例如:

[Copy to clipboard][ - ] CODE:

[sam@chenwy sam]$ awk 'BEGIN{print "Name\tDifference"}{if($6<$7) {diff=$7-$6;print $1,diff}}' grade.txt

Name Difference

M.Tans 4

J.Lulu 2

7. 增加列值

为增加列数或进行运行结果统计,使用符号+ =。增加的结果赋给符号左边变量值,增加到变量的域在符号右边。例如将$ 1加入变量t o t a l,表达式为t o t a l + = $ 1。列值增加很有用。许多文件都要求统计总数,但输出其统计结果十分繁琐。在a w k中这很简单,请看下面的例子。

将所有学生的…目前级别分?加在一起,方法是t o t + = $ 6,t o t即为a w k浏览的整个文件的域6结果总和。所有记录读完后,在E N D部分加入一些提示信息及域6总和。不必在a w k中显示说明打印所有记录,每一个操作匹配时,这是缺省动作。

[Copy to clipboard][ - ] CODE:

[sam@chenwy sam]$ awk '(tot+=$6); END{print "Club student total points :" tot}'

grade.txt

M.Tans 5/99 48311 Green 8 40 44

J.Lulu 06/99 48317 green 9 24 26

P.Bunny 02/99 48 Yellow 12 35 28

J.Troll 07/99 4842 Brown-3 12 26 26

L.Tansl 05/99 4712 Brown-2 12 30 28

Club student total points :155

如果文件很大,你只想打印结果部分而不是所有记录,在语句的外面加上圆括号()即可。

[Copy to clipboard][ - ] CODE:

[sam@chenwy sam]$ awk '{(tot+=$6)}; END{print "Club student total points :" tot}' grade.txt

Club student total points :155

8. 文件长度相加

在目录中查看文件时,如果想快速查看所有文件的长度及其总和,但要排除子目录,使用ls -l命令,然后管道输出到a w k,a w k首先剔除首字符为d(使用正则表达式)的记录,然后将文件长度列相加,并输出每一文件长度及在E N D部分输出所有文件的长度。

本例中,首先用ls -l命令查看一下文件属性。注意第二个文件属性首字符为d,说明它是一个目录,文件长度是第5列,文件名是第9列。如果系统不是这样排列文件名及其长度,应适时加以改变。

下面的正则表达式表明必须匹配行首,并排除字符d,表达式为^ [ ^ d ]。

使用此模式打印文件名及其长度,然后将各长度相加放入变量t o t中。

[Copy to clipboard][ - ] CODE:

[sam@chenwy sam]$ ls -l | awk '/^[^d]/ {print $9"\t"$5} {tot+=$5} END {print "total KB:" tot}' ...................

total KB:174144

内置的字符串函数

[Copy to clipboard][ - ] CODE:

awk内置字符串函数

g s u b ( r, s ) 在整个$ 0中用s替代r

g s u b ( r, s , t ) 在整个t中用s替代r

i n d e x ( s , t ) 返回s中字符串t的第一位置

l e n g t h ( s ) 返回s长度

m a t c h ( s , r ) 测试s是否包含匹配r的字符串

s p l i t ( s , a , f s ) 在f s上将s分成序列a

s p r i n t ( f m t , e x p ) 返回经f m t格式化后的e x p

s u b ( r, s ) 用$ 0中最左边最长的子串代替s

s u b s t r ( s , p ) 返回字符串s中从p开始的后缀部分

s u b s t r ( s , p , n ) 返回字符串s中从p开始长度为n的后缀部分

g s u b函数有点类似于s e d查找和替换。它允许替换一个字符串或字符为另一个字符串或字符,并以正则表达式的形式执行。第一个函数作用于记录$ 0,第二个g s u b函数允许指定目标,然而,如果未指定目标,缺省为$ 0。

i n d e x(s,t)函数返回目标字符串s中查询字符串t的首位置。l e n g t h函数返回字符串s字符长度。

m a t c h函数测试字符串s是否包含一个正则表达式r定义的匹配。s p l i t使用域分隔符f s将字符串s划分为指定序列a。

s p r i n t函数类似于p r i n t f函数(以后涉及),返回基本输出格式f m t的结果字符串e x p。

s u b(r,s)函数将用s替代$ 0中最左边最长的子串,该子串被(r)匹配。

s u b(s,p)返回字符串s在位置p后的后缀。s u b s t r(s,p,n)同上,并指定子串长度为n。

现在看一看a w k中这些字符串函数的功能。

1. gsub

要在整个记录中替换一个字符串为另一个,使用正则表达式格式,/目标模式/,替换模式/。例如改变学生序号4 8 4 2到4 8 9 9:

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy root]# cd /usr/sam

[root@Linux_chenwy sam]# awk 'gsub(/4842/,4899){print $0}' grade.txt

J.Troll 07/99 4899 Brown-3 12 26 26

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk 'gsub(/4842/,4899)' grade.txt

J.Troll 07/99 4899 Brown-3 12 26 26

2. index

查询字符串s中t出现的第一位置。必须用双引号将字符串括起来。例如返回目标字符串B u n n y中n y出现的第一位置,即字符个数。

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk 'BEGIN {print index("Bunny","ny")}' grade.txt

4

3. length

返回所需字符串长度,例如检验字符串J . Tr o l l返回名字及其长度,即人名构成的字符个数

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '$1=="J.Troll" {print length($1)" "$1}' grade.txt

7 J.Troll

还有一种方法,这里字符串加双引号。

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk 'BEGIN{print length("A FEW GOOD MEN")}'

14

4. match

m a t c h测试目标字符串是否包含查找字符的一部分。可以对查找部分使用正则表达式,返回值为成功出现的字符排列数。如果未找到,返回0,第一个例子在A N C D中查找d。因其不存在,所以返回0。第二个例子在A N C D中查找D。因其存在,所以返回A N C D中D出现的首位置字符数。第三个例子在学生J . L u l u中查找u。

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk 'BEGIN{print match("ANCD",/d/)}'

[root@Linux_chenwy sam]# awk 'BEGIN{print match("ANCD",/D/)}'

4

[root@Linux_chenwy sam]# awk '$1=="J.Lulu" {print match($1,"u")}' grade.txt

4

5. split

使用s p l i t返回字符串数组元素个数。工作方式如下:如果有一字符串,包含一指定分隔符- ,例如A D2 - K P 9 - J U 2 - L P - 1,将之划分成一个数组。使用s p l i t,指定分隔符及数组名。此例中,命令格式为( " A D 2 - K P 9 - J U 2 - L P - 1 ",p a r t s _ a r r a y," - "),s p l i t然后返回数组下标数,这里结果为4。

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk 'BEGIN {print split("123-456-789",pats_array,"-")}'3

还有一个例子使用不同的分隔符。

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk 'BEGIN {print split("123#456#789",myarray,"#")}' 3

这个例子中,s p l i t返回数组m y a r r a y的下标数。数组m y a r r a y取值如下:

[Copy to clipboard][ - ] CODE:

myarray[1]=123

myarray[2]=456

myarray[3]=789

结尾部分讲述数组概念。

6. sub

使用s u b发现并替换模式的第一次出现位置。字符串S T R包含…poped popo pill?,执行下列s u b命令s u b(/ o p /," o p ",S T R)。模式o p第一次出现时,进行替换操作,返回结果如下:…pO Ped pope pill?。

如:学生J . Tr o l l的记录有两个值一样,“目前级别分”与“最高级别分”。只改变第一个为2 9,第二个仍为2 4不动,操作命令为s u b(/ 2 6 /," 2 9 ",$ 0),只替换第一个出现2 4的位置。注意J . Tr o l l记录需存在。

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '$1=="J.Troll" sub(/26/,"29",$0)' grade.txt

M.Tans 5/99 48311 Green 8 40 44

J.Lulu 06/99 48317 green 9 24 29

P.Bunny 02/99 48 Yellow 12 35 28

J.Troll 07/99 4842 Brown-3 12 29 26

L.Tansl 05/99 4712 Brown-2 12 30 28

7. substr

s u b s t r是一个很有用的函数。它按照起始位置及长度返回字符串的一部分。例子如下:

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '$1=="L.Tansl" {print substr($1,1,3)}' grade.txt

L.T

上面例子中,指定在域1的第一个字符开始,返回其前面5个字符。

如果给定长度值远大于字符串长度, a w k将从起始位置返回所有字符,要抽取L Ta n s l - e y的姓,只需从第3个字符开始返回长度为7。可以输入长度9 9,a w k返回结果相同。

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '$1=="L.Tansl" {print substr($1,1,99)}' grade.txt

L.Tansl

s u b s t r的另一种形式是返回字符串后缀或指定位置后面字符。这里需要给出指定字符串及其返回字串的起始位置。例如,从文本文件中抽取姓氏,需操作域1,并从第三个字符开始:

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk '{print substr($1,3)}' grade.txt

Tans

Lulu

Bunny

Troll

Tansl

还有一个例子,在B E G I N部分定义字符串,在E N D部分返回从第t个字符开始抽取的子串。

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# awk 'BEGIN{STR="A FEW GOOD MEN"}END{print substr(STR,7)}' grade.txt

GOOD MEN

8. 从s h e l l中向a w k传入字符串

a w k脚本大多只有一行,其中很少是字符串表示的。大多要求在一行内完成a w k脚本,这一点通过将变量传入a w k 命令行会变得很容易。现就其基本原理讲

述一些例子。

使用管道将字符串s t a n d - b y传入a w k,返回其长度。

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# echo "Stand-by" | awk '{print length($0)}'

8

设置文件名为一变量,管道输出到a w k,返回不带扩展名的文件名。

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# STR="mydoc.txt"

[root@Linux_chenwy sam]# echo $STR|awk '{print substr($STR,1,5)}'

mydoc

设置文件名为一变量,管道输出到a w k,只返回其扩展名。

[Copy to clipboard][ - ] CODE:

[root@Linux_chenwy sam]# STR="mydoc.txt"

[root@Linux_chenwy sam]# echo $STR|awk '{print substr($STR,7)}'

txt

字符串屏蔽序列

使用字符串或正则表达式时,有时需要在输出中加入一新行或查询一元字符。

打印一新行时,(新行为字符\ n),给出其屏蔽序列,以不失其特殊含义,用法为在字符串前加入反斜线。例如使用\ n强迫打印一新行。

如果使用正则表达式,查询花括号({ }),在字符前加反斜线,如/ \ { /,将在a w k中失掉其特殊含义。

[Copy to clipboard][ - ] CODE:

awk中使用的屏蔽序列

\ b 退格键

\ t t a b键

\ f 走纸换页

\ d d d 八进制值

\ n 新行

\ c 任意其他特殊字符,例如\ \为反斜线符号

\ r 回车键

使用上述符号,打印May Day,中间夹t a b键,后跟两个新行,再打印May Day,但这次使用八进制数1 0 4、1 4 1、1 7 1、分别代表D、a、y。

[Copy to clipboard][ - ] CODE:

[root@chenwy sam]# awk 'BEGIN {print"\n\May\tDay\n\nMay\t\104\141\171"}'

May Day

May Day

注意,\ 1 0 4为D的八进制A S C I I码,\ 1 4 1为a的八进制A S C I I码,等等。

awk输出函数printf

目前为止,所有例子的输出都是直接到屏幕,除了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([格式控制符],参数),格式控制字符通常在引号里。

printf修饰符

[Copy to clipboard][ - ] CODE:

- 左对齐

Wi d t h 域的步长,用0表示0步长

. p r e c 最大字符串长度,或小数点右边的位数

表9-7 awk printf格式

% c A S C I I字符

% d 整数

% e 浮点数,科学记数法

% f 浮点数,例如(1 2 3 . 4 4)

% g a w k决定使用哪种浮点数转换e或者f

% o 八进制数

% s 字符串

% x 十六进制数

1. 字符转换

观察A S C I I码中6 5的等价值。管道输出6 5到a w k。p r i n t f进行A S C I I码字符转换。这里也加入换行,因为缺省情况下p r i n t f不做换行动作。

[Copy to clipboard][ - ] CODE:

A[sam@chenwy sam]$ echo "65" | awk '{printf "%c\n",$0}'

A

按同样方式使用a w k得到同样结果。

[Copy to clipboard][ - ] CODE:

[sam@chenwy sam]$ awk 'BEGIN{printf "%c\n",65}'

A

所有的字符转换都是一样的,下面的例子表示进行浮点数转换后… 9 9 9?的输出结果。整数传入后被加了六个小数点。

[Copy to clipboard][ - ] CODE:

[sam@chenwy sam]$ awk 'BEGIN{printf "%f\n",999}'

999.000000

2. 格式化输出

打印所有的学生名字和序列号,要求名字左对齐,1 5个字符长度,后跟序列号。注意\ n换行符放在最后一个指示符后面。输出将自动分成两列。

[Copy to clipboard][ - ] CODE:

[root@chenwy sam]# awk '{printf "%-15s %s\n",$1,$3}' grade.txt

M.Tans 48311

J.Lulu 48317

P.Bunny 48

J.Troll 4842

L.Tansl 4712

加入一些文本注释帮助理解报文含义。可在正文前嵌入头信息。注意这里使用p r i n t加入头信息。如果愿意,也可使用p r i n t f。

[Copy to clipboard][ - ] CODE:

[root@chenwy sam]# awk 'BEGIN{print "Name\t\tS.Number"}{printf "%-15s %s\n",$1,$3}' grade.txt

Name S.Number

M.Tans 48311

J.Lulu 48317

P.Bunny 48

J.Troll 4842

L.Tansl 4712

3.向一行a w k命令传值

LINUX awk用法

AWK 尹会生 --2010.9.6注:本文档中的代码和图片均来自《sed与awk(第二版)》

一 编写awk脚本 HELLO,WORLD $ echo 'this line of data is ignored' > test $ awk '{ print "Hello, world" }' test Hello, world test文件只包含一行,因此,print操作只执行一次。 $ cat test2 Hello, world $ awk '{ print }' test2 Hello, world print语句没有参数,只简单输出每个输入行。 $ awk ‘BEGIN {print “hello,World”}’ Hello,World

BEGIN模式不需要等待输入,它在第一个输入行读入之前执行。 awk程序设计模型 awk程序由所谓的主输入(main input)循环组成。一个循环称作一个例程。awk允许你编写两个特殊的例程,他们在任何输入被读取前和所有输入都被读取后执行。他们是与BEGIN和END规则相关的过程。BEGIN和END过程是可选的。 模式匹配 src1.awk # test for integer, string or empty line. /[0-9]+/ { print "That is an integer" } /[A-Za-z]+/ { print "This is a string" } /^$/ { print "This is a blank line." }

一个特殊的例子: $ awk -f awkscr 4T That is an integer This is a string 一行可以匹配一条或多条规则 程序脚本的注释 # 以#号开始的一行 记录和字段 awk假设它的输入是有结构的,而不是一串无规则的字符。默认它将每个输入行作为一条记录,而将由空格或制表符分隔的单词作为字段。连续的多个空格和/或制表符被作为一个分隔符。 John Robinson 666-555-1111 字段的引用和分离 awk允许使用字段操作符$来指定字段。$后面可以跟着一个数字或者一个变量。$1表示第一个字段,$2表示第二个字段,$0表示整个输入记录。 $ awk '{ print $2, $1, $3 }' names Robinson John 666-555-1111

awk命令

什么是awk? 你可能对UNIX比较熟悉,但你可能对awk很陌生,这一点也不奇怪,的确,与其优秀的功能相比,awk还远没达到它应有的知名度。awk是什么?与其它大多数UNIX命令不同的是,从名字上看,我们不可能知道awk的功能:它既不是具有独立意义的英文单词,也不是几个相关单词的缩写。事实上,awk是三个人名的缩写,他们是:Aho、(Peter)Weinberg 和(Brain)Kernighan。正是这三个人创造了awk---一个优秀的样式扫描与处理工具。 AWK的功能是什么?与sed和grep很相似,awk是一种样式扫描与处理工具。但其功能却大大强于sed和grep。awk提供了极其强大的功能:它几乎可以完成grep和sed所能完成的全部工作,同时,它还可以可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上,awk 的确拥有自己的语言:awk程序设计语言,awk的三位创建者已将它正式定义为:样式扫描和处理语言。 为什么使用awk? 即使如此,你也许仍然会问,我为什么要使用awk? 使用awk的第一个理由是基于文本的样式扫描和处理是我们经常做的工作,awk所做的工作有些象数据库,但与数据库不同的是,它处理的是文本文件,这些文件没有专门的存储格式,普通的人们就能编辑、阅读、理解和处理它们。而数据库文件往往具有特殊的存储格式,这使得它们必须用数据库处理程序来处理它们。既然这种类似于数据库的处理工作我们经常会遇到,我们就应当找到处理它们的简便易行的方法,UNIX有很多这方面的工具,例如sed 、grep、sort以及find等等,awk是其中十分优秀的一种。 使用awk的第二个理由是awk是一个简单的工具,当然这是相对于其强大的功能来说的。的确,UNIX有许多优秀的工具,例如UNIX天然的开发工具C语言及其延续C++就非常的优秀。但相对于它们来说,awk完成同样的功能要方便和简捷得多。这首先是因为awk提供了适应多种需要的解决方案:从解决简单问题的awk命令行到复杂而精巧的awk程序设计语言,这样做的好处是,你可以不必用复杂的方法去解决本来很简单的问题。例如,你可以用一个命令行解决简单的问题,而C不行,即使一个再简单的程序,C语言也必须经过编写、编译的全过程。其次,awk本身是解释执行的,这就使得awk程序不必经过编译的过程,同时,这也使得它与shell script程序能够很好的契合。最后,awk本身较C语言简单,虽然awk吸收了C语言很多优秀的成分,熟悉C语言会对学习awk有很大的帮助,但awk 本身不须要会使用C语言——一种功能强大但需要大量时间学习才能掌握其技巧的开发工具。 使用awk的第三个理由是awk是一个容易获得的工具。与C和C++语言不同,awk只有一个文件(/bin/awk),而且几乎每个版本的UNIX都提供各自版本的awk,你完全不必费心去想如何获得awk。但C语言却不是这样,虽然C语言是UNIX天然的开发工具,但这个开发工具却是单独发行的,换言之,你必须为你的UNIX版本的C语言开发工具单独付费(当然使用D版者除外),获得并安装它,然后你才可以使用它。

Thizlinux 系统教程 Shell 经典实例

Thizlinux 系统教程Shell 经典实例 ----------------Milo经典小shell 1 列目录树的shell 脚本如下: #!/bin/sh # dtree: Usage: dtree [any directory] dir=${1:-.} (cd $dir; pwd) find $dir -type d -print | sort -f | sed -e "s,^$1,," -e "/^$/d" -e "s,[^/]*/([^/]*)$,`----1," -e "s,[^/]*/,| ,g" 2 while中使用read (file是一个文件) cat file | while read line do echo $line echo " :: Please input any key(s):c" str4read="" while true do chr4read=`dd if=/dev/tty bs=1 count=1 2>/dev/null` str4read=$str4read$chr4read if [ "$chr4read" = "" ] ;then break; fi done echo " :: |$str4read|" done 3 将多个空格替换为字符 sed 's/[ ][ ]*/ /g' 如果空格与tab共存时用 sed -e 's/[[:space:]][[:space:]]*/ /g' filename 4用脚本实现分割文件 #!/bin/bash if [ $# -ne 2 ]; then echo 'Usage: split file size(in bytes)' exit fi file=$1 size=$2 if [ ! -f $file ]; then echo "$file doesn't exist" exit fi #TODO: test if $size is a valid integer filesize=`/bin/ls -l $file | awk '{print $5}'` echo filesize: $filesize let pieces=$filesize/$size let remain=$filesize-$pieces*$size if [ $remain -gt 0 ]; then let pieces=$pieces+1 fi echo pieces: $pieces i=0 while [ $i -lt $pieces ]; do echo split: $file.$i: dd if=$file of=$file.$i bs=$size count=1 skip=$i let i=$i+1 done echo "#!/bin/bash" > merge echo "i=0" >> merge echo "while [ $i -lt $pieces ];" >> merge echo "do" >> merge echo " echo merge: $file.$i" >> merge echo " if [ ! -f $file.$i ]; then" >> merge echo " echo merge: $file.$i missed" >> merge echo " rm -f $file.merged" >> merge echo " exit" >> merge echo " fi" >> merge echo " dd if=$file.$i of=$file.merged bs=$size count=1 seek=$i" >> merge echo " let i=$i+1" >> merge echo "done" >> merge chmod u+x merge' 5得到上月未日期,格式为YYYYMMDD get_lastday_of_lastmonth() { yy=`date +%Y` mm=`date +%m-1|bc` [ $mm -lt 1 ] && mm=12;yy=`expr $yy - 1` aaa=`cal $mm $yy` dd=`echo $aaa|awk '{print $NF}'` echo $yy$mm$dd } print $NF的$NF是打印最后一个列。因为awk的内置变量NF是列的总数,而$NF就代表着最后一列 6 实现用backup或tar命令来做目录备份

linux awk将多个文件结果列合并到一个文件

Linux下awk将多个文件的结果列合并到一个文件在使用NS进行模拟结果数据处理的时候,往往需要对多组参数的结果进行比较来鉴别性能的优劣,这里编写了一个使用awk将多个同类型结果文件进行合并操作的脚本。如,NS模拟结果中,经常出现多个网络参数(协议类型、误码率、带宽、背景流、时延等)取不同值条件下进行一些网络指标(RTT,cwnd,吞吐量、网络利用率、公平性等)统计,这时会产生N 多组实验结果,怎样对这么多组结果中的单个指标(常见的吞吐量)进行比较,如果使用手工粘贴到excel再进行绘图就显得任务量很大,显得人脑子比较笨(当然,最优秀的程序员永远是最懒的,我恰巧也是其中之一)。 小提示:为了方便NS模拟结果直接在excel里面打开,建议结果数据以文本形式(.txt,.dat)保存,各数据列之间用制表符\t(excel默认分隔符),这样在文件上右键-》Excel打开即可,而不用在excel 里面使用数据导入向导设置分隔符这么麻烦。一切以提高生产效率和生活质量为根本出发点O(∩_∩)O~。 这里给出一个awk脚本来实现上面的问题。 test.awk: #!/usr/bin/awk -f BEGIN { #print ARGC; Index[ARGC];#记录各个文件的行下标 for(t=1;t<=ARGC;t++) { Index[t]=0; } } { #文件数ARGC-1,第一个参数是应用程序名awk. for(t=1;t<=ARGC;t++) { if(FILENAME==ARGV[t]) { line[t,Index[t]]=$0;#$0=整行,前提是各个文件行列之间已经被\t制表符分隔。 #line[t,Index[t]]=sprintf("%s\t%s",$1,$2);#如果固定为几列,也可以用这个。 Index[t]++; } } } END { maxcount=0; for(i=1;i<=ARGC;i++) { if(Index[i]>maxcount) maxcount=Index[i]; } #printf("maxcount:%d",maxcount);

GAWK入门

GAWK 入门:AWK 语言基础 利用GAWK 的开放源代码实现学习AWK 了解A WK 文本处理和模式扫描语言的基本概念。本教程将带您开始使用A WK 进行编程:您将了解A WK 如何读取输入数据和对其进行排序、如何运行A WK 程序、操作数据并进行复杂的模式匹配。当您完成本教程的学习时,同时也了解了GNU A WK (GA WK)。 开始之前 了解本教程中介绍的内容、如何最好地利用它以及在学习本教程的过程中需要完成哪些工作。 关于本教程 GNU A WK (GAWK) 是历史悠久的A WK 编程语言的开放源代码实现,可用于所有的UNIX? 系统。A WK 语言是一种UNIX 备用工具,它是一种功能强大的文本操作和模式匹配语言,特别适用于进行信息检索,这使得它非常适合用于当今的数据库驱动的应用程序。因为它集成于UNIX 环境,所以可以设计、构建和快速地执行完整的工作程序,并且立即就能得到结果。 本教程为A WK 文本处理语言提供了实践性的介绍。它介绍了如何使用开放源代码GA WK 解释器来编写和执行A WK 程序,以便通过各种方式来搜索和操作数据。 目标 本教程面向那些需要利用A WK 强大的文本操作功能的读者。在本教程中,您将使用GA WK,以了解各种运行A WK 程序的方法。您还将了解如何组织程序,并学习A WK 的记录和字段范例。在完成本教程后,您可以学习到该语言的基本内容,包括格式化输出、记录和字段操作以及模式匹配。您还应该能够编写自定义的A WK 程序,以使用UNIX 命令行执行复杂的文本处理。 先决条件 本教程没有特殊的先决条件,不过您应该熟悉UNIX 命令行Shell 的使用。如果您对 C 编程语言的构造比较熟悉,那么将会很有帮助,但这并不是必需的。 系统要求 您必须在系统中安装GA WK 的工作副本,最好是V ersion 3.0 或更高版本。很容易获得GA WK 的源代码和二进制包。如果您使用源代码安装GA WK,请参考GA WK 源代码分发版中的README 文件,其中列出了进行成功的编译和安装所需的任何附加软件。

awk分隔符学习

3.请执行命令取出linux中eth0的IP地址(请用cut,有能力者也可分别用awk,sed命令答)。 解答: 说明:此题解答方法已经给大家讲解了不下15种,还可以有很多,在这里给大家着重讲下awk的技巧用法,希望大家能多重视老师的思路、思维过程,不过过分关注问题的答案,以便达到学一通十的效果。 方法一【此法为绿叶】:如果用awk来处理的话,一般的同学可能会用下面的办法实现: [root@oldboy ~]# ifconfig eth0|grep 'inet addr'|awk -F ":" '{print $2}'|awk '{print $1}' 10.0.0.162 小结:这个方法是常规方法,很好。但是我们有没有更简单的awk实现方法呢?往下看。 方法二【此法为小红花】:通过awk同时使用多个分隔符来实现: [root@oldboy ~]# ifconfig eth0|grep 'inet addr'|awk -F '[ :]' '{print $13}' 192.168.1.186 提示:本题通过使用空格或冒号来做分隔符,然后一次性取出结果,就是空格或冒号可以看做是同一个分隔符。

小结:这个方法很方便吧,同学们可以多用,选取包含IP 地址行的特殊关键字'inet addr’过滤然后,使用awk以空格和:同时做分隔符,然后取出需要的内容。 本答案的最大缺点就是计算$n的时候很费劲,因为inet 前面有多个空格,查到$13,真是不容易,如此看来从实现时间上可能还不如第一个方法快呢?那好引出我们今天的关键答案案例。 方法三【大红花出场】:通过awk同时使用多个分隔符,然后通过正则匹配多个分隔符的方法来实现: [root@oldboy ~]# ifconfig eth0 |awk -F '[ :]+' 'NR==2 {print $4}' 10.0.0.185 我们来说明下这个简单易用的好办法: 提示:本题NR是行号,分隔符+号匹配,[]里一个或多个任意一个分隔符,这里就是匹配一个或多个冒号或空格。1)awk -F 后面跟分隔符‘[空格:]+’,其中[空格:]多分隔符写法,意思是以空格或冒号做分隔,后面的"+"号是正则表达式,意思是匹配前面空格或冒号,两者之一的1个或1个以上。 2)NR==2和sed -n "2p",相当,意思都是选择第几行,例:[root@oldboy ~]# ifconfig eth0|awk NR==2

ubuntu shell 使用命令大全

ubuntu shell 使用命令大全 前言 下面的命令大都需要在控制台/ 终端/ shell 下输入。 控制台, 终端, 和shell 意味着同样一件事- 一个命令行界面,他可以用来控制系统。 打开一个控制台: 应用程序--> 附件--> 终端 任何一个使用'sudo' 作为前缀的命令都需要拥有管理员(或root) 访问权限。所以你会被提示输入你自己的密码。 安装升级 查看软件xxx安装内容 dpkg -L xxx 查找软件库中的软件 apt-cache search 正则表达式 或 aptitude search 软件包 显示系统安装包的统计信息 apt-cache stats 显示系统全部可用包的名称 apt-cache pkgnames 显示包的信息 apt-cache show k3b 查找文件属于哪个包 apt-file search filename 查看已经安装了哪些包 dpkg -l 查询软件xxx依赖哪些包 apt-cache depends xxx 查询软件xxx被哪些包依赖 apt-cache rdepends xxx 增加一个光盘源 sudo apt-cdrom add 系统升级 sudo apt-get update (这一步更新包列表) sudo apt-get dist-upgrade (这一步安装所有可用更新) 或者 sudo apt-get upgrade (这一步安装应用程序更新,不安装新内核等) 清除所有已删除包的残馀配置文件 dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P 如果报如下错误,证明你的系统中没有残留配置文件了,无须担心。 dpkg: --purge needs at least one package name argument Type dpkg --help for help about installing and deinstalling packages [*]; Use `dselect' or `aptitude' for user-friendly package management; Type dpkg -Dhelp for a list of dpkg debug flag values; Type dpkg --force-help for a list of forcing options; Type dpkg-deb --help for help about manipulating *.deb files; Type dpkg --license for copyright license and lack of warranty (GNU GPL) [*]. Options marked [*] produce a lot of output - pipe it through `less' or `more' ! 编译时缺少h文件的自动处理 sudo auto-apt run ./configure 查看安装软件时下载包的临时存放目录

Linux下使用awk批量删除共享内存

Linux下使用awk批量删除共享内存 1.awk简介 awk 是一个强大的文本分析工具。sed 常常用于一整个行的处理,而awk 则倾向于以空格和tab键为默认分隔符将每行切片成一个个域(也就是一列)来处理。Awk适用于小型的数据数据处理 awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是AWK 的GNU 版本。 2. awk语法格式 a wk 'pattern1 {action1} pattern2 {action2} ...' filename awk 后面接两个单引号并加上大括号{} 来对匹配模式的数据进行处理。awk 可以处理后面指定的文件,也可以通过管道命令”|”读取来自前个命令的标准输出。 3.工作流程 awk工作流程是这样的:读入有'\n'换行符分割的多条记录,然后将每一条记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是空格键和tab键。 以last命令结合awk来演示awk一个简单的筛选输出。 们用last 可以将登陆者的数据取出来,结果如下所示: [root@lvlv]# last -n 4 root pts/1 192.168.1.100 Tue Feb 10 11:21 still logged in root pts/1 192.168.1.100 Tue Feb 10 00:46 - 02:28 (01:41) root pts/1 192.168.1.100 Mon Feb 9 11:41 - 18:30 (06:48) dmtsai pts/1 192.168.1.100 Mon Feb 9 11:41 - 11:41 (00:00) 若我想要取出帐号与登陆者的IP ,且帐号与IP 之间以[tab] 隔开,则会变成这样: [root@lvlv]# last -n 5 | awk '{print $1 "\t" $3}' root 192.168.1.100 root 192.168.1.100 root 192.168.1.100 dmtsai 192.168.1.100 4.利用awk批量删除共享内存 首先利用“ipcs –m”查看共享内存信息,然后再利用“ipcrm -m shmid”删除共享内存。利用awk进行批量删除共享内存的shell脚本如下: ipcs -m|awk '$2~/[0-9]+/{print $2}'| while read s do ipcrm -m $s done 结合上面对awk的介绍,应该不难看懂脚本。awk '$2~/[0-9]+/{print $2}'表示打印出只含阿拉伯数字的每行的第二列,即共享内存标识。awk中正则表达式由两个斜杠包围,即/REG/,

awk正则表达式介绍

awk命令详解 简单使用: awk :对于文件中一行行的独处来执行操作。 awk -F :'{print $1,$4}' :使用‘:’来分割这一行,把这一行的第一第四个域打印出来。 详细介绍: AWK命令介绍 awk语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息,awk抽取信息 后,才能进行其他文本操作,完整的awk脚本通常用来格式化文本文件中的信息 1.调用awk: 第一种命令行方式,如: awk [-Field-separator] 'commands' input-file(s) 这里commands是真正的awk命令,[-F域分隔符]是可选的,awk默认使用空格分隔, 因此如果要浏览域间有空格的文本,不必指定这个选项,但如果浏览如passwd文件,此文件 各域使用冒号作为分隔符,则必须使用-F选项: awk -F : 'commands' input-file 第二种,将所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚 本的首行,以便通过键入脚本名称来调用它 第三种,将所有awk命令插入一个单独文件,然后调用,如: awk -f awk-script-file input-file -f选项指明在文件awk-script-file的awk脚本,input-file是使用awk进行浏览 的文件名 2.awk脚本: awk脚本由各种操作和模式组成,根据分隔符(-F选项),默认为空格,读取的内容依次放置到 对应的域中,一行一行记录读取,直到文件尾 2.1.模式和动作

任何awk语句都是由模式和动作组成,在一个awk脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。动作即对数据进行的操作,如果省去模式部分,动作将时刻保持执行状态 模式可以是任何条件语句或复合语句或正则表达式,模式包含两个特殊字段BEGIN和END,使用BEGIN语句设置计数和打印头,BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行;END语句用来在awk完成文本浏览动作后打印输出文本总数和结尾状态标志,有动作必须使用{}括起来 实际动作在大括号{}内指明,常用来做打印动作,但是还有更长的代码如if和循环looping 语句及循环退出等,如果不指明采取什么动作,awk默认打印出所有浏览出的记录 2.2.域和记录: awk执行时,其浏览标记为$1,$2...$n,这种方法称为域标记。使用$1,$3表示参照第1和第3域,注意这里使用逗号分隔域,使用$0表示使用所有域。例如: awk '{print $0}' temp.txt > sav.txt 表示打印所有域并把结果重定向到sav.txt中 awk '{print $0}' temp.txt|tee sav.txt 和上例相似,不同的是将在屏幕上显示出来 awk '{print $1,$4}' temp.txt 只打印出第1和第4域 awk 'BEGIN {print "NAME GRADE\n----"} {print $1"\t"$4}' temp.txt 表示打信息头,即输入的内容的第一行前加上"NAME GRADE\n-------------",同时内容以tab分开 awk 'BEGIN {print "being"} {print $1} END {print "end"}' temp 同时打印信息头和信息尾 2.3.条件操作符: <、<=、==、!=、>=、~匹配正则表达式、!~不匹配正则表达式

Linux awk命令详解

Linux awk命令详解 AWK介绍 0.awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk。 1.awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。完整的awk脚本通常用来格式化文本文件中的信息。 2.三种方式调用awk 1) awk [opion] 'awk_script' input_file1 [input_file2 ...] awk的常用选项option有; ① -F fs : 使用fs作为输入记录的字段分隔符,如果省略该选项,awk使用环境变量IFS的值 ② -f filename : 从文件filename中读取awk_script ③ -v var=value : 为awk_script设置变量 2) 将awk_script放入脚本文件并以#!/bin/awk -f 作为首行,给予该脚本可执行权限,然后在shell下通过键入该脚本的脚本名调用之。 3) 将所有的awk_script插入一个单独脚本文件,然后调用: awk -f awk脚本文件input_file(s) 3. awk的运行过程 1) awk_script的组成: ① awk_script可以由一条或多条awk_cmd组成,两条awk_cmd之间一般以NEWLINE分隔 ② awk_cmd由两部分组成: awk_pattern { actions } ③ awk_script可以被分成多行书写,必须确保整个awk_script被单引号括起来。 2) awk命令的一般形式: awk ' BEGIN { actions } awk_pattern1 { actions } ............ awk_patternN { actions } END { actions } ' inputfile 其中BEGIN { actions } 和END { actions } 是可选的。 3) awk的运行过程: ①如果BEGIN 区块存在,awk执行它指定的actions。 ② awk从输入文件中读取一行,称为一条输入记录。(如果输入文件省略,将从标准输入读取) ③awk将读入的记录分割成字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。字段分隔符使用shell环境变量IFS或由参数指定。 ④把当前输入记录依次与每一个awk_cmd中awk_pattern比较,看是否匹配,如果相匹配,就执行对应的actions。如果不匹配,就跳过对应的actions,直到比较完所有的awk_cmd。 ⑤当一条输入记录比较了所有的awk_cmd后,awk读取输入的下一行,继续重复步骤③和④,这个过程一

Linux awk命令使用详解

Linux awk命令使用详解 简单介绍一下,awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大,这是我们玩linux的必备基本功,若要对其身世有更详尽的了解,自行搜索即可。对于工具的知识,笔者尽量将每个知识点的简要说明,并给出实例。 简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。 用法: awk [options] 'scripts' file1,file2... awk [options] 'pattern {action}' file1,file2... options是awk的支持的选项,譬如-F -v等; scripts是其处理脚本,包含模式pattern和动作action(模式和动作的关系一般为,模式负责确定有效字段,动作负责对其处理) 一、print的简单使用

创建一个简单的测试文件如下: [root@mos download]# cat demo.txt Welcome to mos blog. This is a test file. 例:打印整行: $0 [root@mos download]# awk '{print $0}' demo.txt Welcome to mos blog. This is a test file. 例:打印每行的最后一个字段: $NF [root@mos download]# awk '{print $NF}' demo.txt blog. file. 例:打印第二个字段: $2 [root@mos download]# awk '{print $2}' demo.txt to is 例:打印每行的倒数第二个字段,并在其后打印OK

AWK简介

AWK介绍 awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk。 1.awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。完整的awk脚本通常用来格式化文本文件中的信息。 2.三种方式调用awk 1) awk [opion] 'awk_script' input_file1 [input_file2 ...] awk 的常用选项option有; ①-F fs : 使用fs作为输入记录的字段分隔符,如果省略该选项,wak使用环境变量IFS的值 ②-f filename : 从文件filename中读取awk_script ③-v var=value : 为awk_script设置变量 2) 将awk_script放入脚本文件并以#!/bin/awk -f 作为首行,给予该脚本可执行权限,然后在shell下通过键入该脚本的脚本名调用之。 3) 将所有的awk_script插入一个单独脚本文件,然后调用: awk -f wak脚本文件input_file(s) 3. awk的运行过程 1) awk_script的组成: ①awk_script可以由一条或多条awk_cmd组成,两条awk_cmd之间一般以NEWLINE分隔 ②awk_cmd由两部分组成: awk_pattern { actions } ③awk_script可以被分成多行书写,必须确保整个awk_script被单引号括起来。 2) awk命令的一般形式: awk ' BEGIN { actions } awk_pattern1 { actions } ............ awk_patternN { actions } END { actions } ' inputfile 其中BEGIN { actions } 和END { actions } 是可选的。 3) awk的运行过程: ①如果BEGIN 区块存在,awk执行它指定的actions。 ②awk从输入文件中读取一行,称为一条输入记录。(如果输入文件省略,将从标准输入读取) ③awk将读入的记录分割成字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。字段分隔符使用shell环境变量IFS 或由参数指定。 ④把当前输入记录依次与每一个awk_cmd中awk_pattern比较,看是否匹配,如果相匹配,就执行对应的actions。如果不匹配,就跳过对应的actions,直到比较完所有的awk_cmd。 ⑤当一条输入记录比较了所有的awk_cmd后,awk读取输入的下一行,继续重

UNIX中特殊符号的使用

更好地理解UNIX? 用户输入的这些“奇怪的” 字符。学习如何在UNIX 中使用管道、重定向、操作符等特性。 现在,您已经在IBM? AIX? 上工作了一段时间了。您已经学习了几个基本命令,能够在目录结构中移动、创建和修改文件、查看正在运行的进程以及管理用户和系统。这很不错,但是您希望了解UNIX? 管理员输入的命令是什么意思。这些命令中包含许多奇怪的符号。在本文中,了解|、>、>>、<、<<、[[和]]等符号在UNIX 和Linux? 中的意思,以及如何使用&&、||、<、<=和!=操作符。 管道 如果您熟悉UNIX,那么管道(或pipe)会是每天都要接触到的东西。管道最初是由Malcolm McIlroy 开发的,可以使用管道把一个命令的标准输出(stdout)定向到下一个命令的标准输入(stdin),这样就形成了连续执行的命令链。可以在一个命令行上使用多个管道。在许多时候,一个命令的stdout 用作下一个命令的stdin,第二个命令的stdout 又被重定向到另一个命令的stdin,依此类推。 例如,在排除故障或执行日常检查时,大多数UNIX 管理员首先做的事情之一是查看系统上当前正在运行的进程。清单1演示这样的检查。 清单 1. 日常进程检查示例 # ps –ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 Jul 27 - 0:05 /etc/init root 53442 151674 0 Jul 27 - 0:00 /usr/sbin/syslogd root 57426 1 0 Jul 27 - 0:00 /usr/lib/errdemon root 61510 1 0 Jul 27 - 23:55 /usr/sbin/syncd 60 root 65634 1 0 Jul 27 - 0:00 /usr/ccs/bin/shlap64 root 82002 110652 0 Jul 27 - 0:24 /usr/lpp/X11/bin/X -x abx -x dbe -x GLX -D /usr/lib/X11//rgb -T -force :0 -auth /var/dt/A:0-SfIdMa root 86102 1 0 Jul 27 - 0:00 /usr/lib/methods/ssa_daemon -l ssa0 root 106538 151674 0 Jul 27 - 0:01 sendmail: accepting connections root 110652 1 0 Jul 27 - 0:00 /usr/dt/bin/dtlogin -daemon root 114754 118854 0 Jul 27 - 20:22 dtgreet root 118854 110652 0 Jul 27 - 0:00 dtlogin <:0> -daemon root 131088 1 0 Jul 27 - 0:07 /usr/atria/etc/lockmgr -a /var/adm/atria/almd -q 1024 -u 256 -f 256 root 147584 1 0 Jul 27 - 0:01 /usr/sbin/cron root 155816 151674 0 Jul 27 - 0:04 /usr/sbin/portmap root 163968 151674 0 Jul 27 - 0:00 /usr/sbin/qdaemon root 168018 151674 0 Jul 27 - 0:00 /usr/sbin/inetd root 172116 151674 0 Jul 27 - 0:03 /usr/sbin/xntpd root 180314 151674 0 Jul 27 - 0:19 /usr/sbin/snmpmibd root 184414 151674 0 Jul 27 - 0:21 /usr/sbin/aixmibd root 188512 151674 0 Jul 27 - 0:20 /usr/sbin/hostmibd root 192608 151674 0 Jul 27 - 7:46 /usr/sbin/muxatmd root 196718 151674 0 11:00:27 - 0:00 /usr/sbin/rpc.mountd root 200818 151674 0 Jul 27 - 0:00 /usr/sbin/biod 6

Shell中的grep、awk和sed的常用命令和语法

常用的grep选项有: -c 只输出匹配行的计数。 -i 不区分大小写(只适用于单字符)。 -h 查询多文件时不显示文件名。 -l 查询多文件时只输出包含匹配字符的文件名。 -n 显示匹配行及行号。 -s 不显示不存在或无匹配文本的错误信息。 -v 显示不包含匹配文本的所有行。 $ grep“sort”*.doc ( #在当前目录下所有. d o c文件中查找字符串”s o r t”) $ grep “sort it” * (#或在所有文件中查询单词”sort it”) 2.行匹配 $ grep -c “48″ data.f $ 4 (#g r e p返回数字4,意义是有4行包含字符串”4 8″。) $ grep “48″ data.f (#显示包含”4 8″字符串的4行文本) 7. 查询空行,查询以某个条件开头或者结尾的行。 结合使用^和$可查询空行。使用- n参数显示实际行数 [root@mypc oid2000]# grep -n “^$” 111.txt (返回结果 2: #说明第二行是空行) [root@mypc oid2000]# grep -n “^abc” 111.txt (#查询以abc开头的行) [root@mypc oid2000]# grep -n “abc$” 111.txt (#查询以abc结尾的行) 8. 匹配特殊字符,查询有特殊含义的字符,诸如$ . ‘ ” * [] ^ | \ + ? ,必须在特定字符前加\。 [root@mypc oid2000]# grep “\.” 111.txt (#在111.txt中查询包含”.”的所有行) [root@mypc oid2000]# grep “my\.conf” 111.txt (#查询有文件名my. c o n f的行) 9. 目录的查询 [root@mypc oid2000]# ls -l |grep “^d” (#如果要查询目录列表中的目录) [root@mypc oid2000]# ls -l |grep “^d[d]“ (#在一个目录中查询不包含目录的所有文件) [root@mypc]# ls -l |grpe “^d…..x..x” (#查询其他用户和用户组成员有可执行权限的目录集合) Awk的常用命令语法 awk [-F filed-s eparator] “commands” input-file(s) [ - F域分隔符]是可选的,a w k使用空格作为缺省的域分隔符 1.2保存a w k输出 $ awk ‘{print $0}’ input-files > out-files (#重定向保存输出) $ awk ‘{print $0}’ input-files | tee out-files (#使用t e e命令,输出到文件的同时输出到屏幕) 1.3 常用的awk命令举例 [root@mypc /]# awk ‘$0 ~ /user/’ /etc/passwd (#如果某域含有user就将该行打

awk命令详解

常用awk命令(转)

awk 用法:awk ' pattern {action} ' 变量名含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS 输入域分隔符,默认为一个空格 RS 输入记录分隔符 NF 当前记录里域个数 NR 到目前为止记录数 OFS 输出域分隔符 ORS 输出记录分隔符 1、awk '/101/' file 显示文件file中包含101的匹配行。 awk '/101/,/105/' file awk '$1 == 5' file awk '$1 == "CT"' file 注意必须带双引号 awk '$1 * $2 >100 ' file awk '$2 >5 && $2<=15' file 2、awk '{print NR,NF,$1,$NF,}' file 显示文件file的当前记录号、域数和每一行的第一个和最后一个域。 awk '/101/ {print $1,$2 + 10}' file 显示文件file的匹配行的第一、二个域加10。 awk '/101/ {print $1$2}' file awk '/101/ {print $1 $2}' file 显示文件file的匹配行的第一、二个域,但显示时域中间没有分隔符。 3、df | awk '$4>1000000 ' 通过管道符获得输入,如:显示第4个域满足条件的行。 4、awk -F "|" '{print $1}' file 按照新的分隔符“|”进行操作。 awk 'BEGIN { FS="[: \t|]" } {print $1,$2,$3}' file 通过设置输入分隔符(FS="[: \t|]")修改输入

相关文档