当前位置:文档之家› Unix awk使用手册

Unix awk使用手册

Unix awk使用手册
Unix awk使用手册

?– ?u e>?T_?`? b v…FLASH b 爱电脑 Y}_?`?BBS给我留言认识版主

unix awkO?u(bK册

O\€ v…话:

《unix awkO?u(bK册》是我几个月前的作品了,回过头来看,这篇文章实在是很粗燥,因当时我写作并上传这个作品时实在是太忙了,没有对文章的质量进行很好的检查,心里老觉得有愧于网友的厚爱,于是趁闲赶忙重写一遍,虽然不一定会有很大的改观,但质量是肯定要好一点的,唯如此,我的良心上才好受一点,呶,下面就是我的修改稿,各位老友请与第一版相比一下,看是否有所进步!

这次改写仍然保留了原有的风格:正文由浅入深,文后附上了大量的相关资料,这样做的原因是为了满足各种用户的需求,这在第一版中已经说过了。这次主要的改变是在内容上,加入了很多新内容,并增加了示例,以帮助读者理解其中的内容,附录也补充了许多新的资料。当然读者要真正地掌握awk? 仅仅读了本文是不够的,还必须有上机实习这一步。值得提醒大家的是,awkg _?Y r Hg,? ^vN T N*rHg,NK??[XW(w@N N?]?别,因此,在使用awkN?RMg Y}S?€ N N O`O?u(v…|?~?v…€Tg:^.

R?0

NàNHf/awk?

O`S?€y对unixk?较熟悉,但你可能对awk_?–Lu ?这一点也不奇怪,的确,与其优秀的功能相比,awk还远没达到它应有的知名度。awkf/NàNH? N Q v[?Y'Y 数unixT}N?N T v…f/? N?T [WN w?b们不可能知道awkv…R?€y? [?eaN f/Qwg 独立意义的英

文单词,也不是几个相关单词的缩写。事实上,awkf/N N*NoT v…缩写,他们是:aho0 (peter)weinbergT?(brain)kernighan0 kcf/这三个人创造了awk---N N*O yàv…h7_ 扫描与处理工具。

awkv…R?€yf/NàNH? N s edT?grep_?v?O

为什么使用awk?

SsO?Y?kd? O`N_许仍然会问,我为什么要使用awk?

O?u(awkv…{,N N*t u1f/WúN?e?g,v…h7_ 扫描和处理是我们经常做的工作,awkb@PZv…]?O\g N??a数据库,但与数据库不同的是,它处理的是文本文件,这些文件没有专门的存储格式,普通的人们就能编辑、阅读、理解和处理它们。而数据库文件往往具有特殊的存储格式,这使得它们必须用数据库处理程序来处理它们。既然这种类似于数据库的处理工作我们经常会遇到,我们就应当找到处理它们的简便易行的方法,unixg _?Y 这方面的工具,例如sed 0 g rep0 s ortN?Sêfind{I{I? a wkf/QvN-

SAR O yàv…N yí0

O?u(awkv…{,N?N*t u1f/awkf/N N*简单的工具,当然这是相对于其强大的功能来说的。的确,unixg 许多优秀的工具,例如unixY)q6v…开发工具c语言及其延续c++\1—^^8v…O yà0 O Fv?对于它们来说,awk[?b T h7v…R?€y‰?e1O?T?简捷得多。这首先是因为awkcDO?N?? 应多种需要的解决方案:从解决简单问题的awkT}N??LR0Y 杂而精巧的awkz ^???计语言,这样做的好处是,你可以不必用复杂的方法去解决本来很简单的问题。例如,你可以用一个命令行解决简单的问题,而cN ?L? S sO?N N* Q?简单的程序,c语言也必须经过编写、编译的全过程。其次,awkg,??f/‰?释执行的,这就使得awkz ^?N _?~?过编译的过程,同时,这也使得它与shell scriptz ^?€yY _?Y}v…YQT 0g T?a wkg,??较c语言简单,虽然awkT8e6N?c语言很多优秀的成

分,熟悉c语言会对学习awkg _?Y'v…^.R?? O Fawkg,??N 须要会使用c语言--N yíR?€y_:Y'OF— ‰?Y'‘?时间学习才能掌握其技巧的开发工具。

使用awkv…{,N N*t u1f/awkf/N N*[1f 获得的工具。与cT?c++语言不同,awkSêg N N*e?N?(/bin/awk)? €N QàNNk?N*rHg,

的unix?ycDO?T ?êrHg,v…awk? O`[?QhN _?费心去想如何获得awk0 O Fc语言却不是这样,虽然c语言是unixY)q6v…开发工具,但这个开发工具却是单独发行的,换言之,你必须为你的unixrHg,v…c语言开发工具单独付费(当然使用drH€ –dY ??获得

并安装它,然后你才可以使用它。

基于以上理由,再加上awk_:Y'v…R?€y? b们有理由说,如果你要处理与文本样式扫描相关的工作,awk应该是你的第一选择。在这里有一个可遵循的一般原则:如果你用普通的shell]?Qwb s hell scriptg Ve难的话,试试awk,Y?g?awkNíN €y‰?Q3问题,则便用c语言,如果c语言仍然失败,则移至c++0

awkv…调用方式

前面曾经说过,awkcDO?N?? 应多种需要的不同解决方案,它们是:

一、awkT}N??L? O`S?N??aO?u(fn? u nixT}N?N h7O?u(awk? W(T}N??LN-O`N_S?N?O?u(awkz ^???计语言,虽然awke/c Y?L

v…录入,但是录入长长的命令行并保证其正确无误却是一件令人头疼的事,因此,这种方法一般只用于解决简单的问题。当然,你也可以在shell scriptz ^?N-_ u(awkT}N??Lu ?óawkz ^?? g,0

N?0 O?u(-f选项调用awkz ^?0 a wkQA许将一段awkz ^?写入一个文本文件,然后在awkT}N??LN-u(-f选项调用并执行这段程序。具体的方法我们将在后面的awk语法中讲到。

三、利用命令解释器调用awkz ^?? R)u(unixe/c v…T}N?‰?释器功能,我们可以将一段awkz ^?写入文本文件,然后在它的第

一行加上:

#!/bin/awk -f

^v赋予这个文本文件以执行的权限。这样做之后,你就可以在命令行中用类似于下面这样的方式调用并执行这段awkz ^?

N?0

$awk? g,e?g,T _…Y t e?N?

awkv…语法:

N Q v[?unixT}N?N h7? a wkb?g ?ê]?v…语法:

awk [ -f re] [parameter...] ['prog'] [-f progfile][in_file...]

S?数说明:

-f re:QA许awkf?e9Qv[WkμR –”{&0

parameter: 该参数帮助为不同的变量赋值。

'prog': awkv…z ^?语句段。这个语句段必须用单拓号:'T?'bì?w? N?–2??shell‰?释。这个程序语句段的标准形式为: 'pattern {action}'

QvN-patternS?数可以是egrepkc则表达式中的任何一个,它可以使用语法/re/Q?R N N N?h7_ S9‘Mb€]?g…b 0N s ed|{O

S?N?O?u(","R 开两样式以选择某个范围。关于匹配的细节,你可以参考附录,如果仍不懂的话,找本unix书学学grepT?sed ? g,Nof/W([f习ed时掌握匹配技术的)。actionS?数总是被大括号包围,它由一系统awk语句组成,各语句之间用";"R –”0 awk‰?释它们,并在pattern给定的样式匹配的记录上执行其操作。与shell|{O v…内容成为注释,在解释执行时,它们将被忽略。你可以省略patternT?actionNKN ?O FN €yN$€ T时省略,当省略pattern时没有样式匹配,表示对所有行(记录)均执行操作,省略action时执行缺省的操作--W(标准输出上显示。

-f progfile:QA许awk调用并执行progfilec [?g z^?e?N?0 p rogfilef/N N*e?g,e?N?? N?_?须符合awkv…语法。

in_file:awkv…?“Qee?N?? a wkQA许对多个输入文件进行处理。值得注意的是awkN O?e9?“Qee?N?0 Y?g?g*c [??“Qee?N?? a wk

将接受标准输入,并将结果显示在标准输出上。awke/c ?“Qe?“Qú‘í[?T 0

awkv…记录、字段与内置变量:

前面说过,awkY t v…]?O\N 数据库的处理方式有相同之处,其相同处之一就是awke/c 对记录和字段的处理,其中对字段

的处理是grepT?sedN €y[?现的,这也是awkO N?N?€ v…S?VàNKN 0W(awkN-? ?:w v…`?QμN `;f/将文本文件中的一行视为一

个记录,而将一行中的某一部分作为记录中的一个字段。为了操作这些不同的字段,awkP u(shellv…e1l?? u($1,$2,$3...这样

的方式来顺序地表示行(记录)中的不同字段。特殊地,awku($0?hy:etN*?L? 记录)。不同的字段之间是用称作分隔符的

字符分隔开的。系统默认的分隔符是空格。awkQA许在命令行中用-f rev…_b_ 来改变这个分隔符。事实上,awku(N N*内置的变量fs来记忆这个分隔符。awkN-g Y}QàN*这样的内置变量,例如,记录分隔符变量rs0 当前工作的记录数nr{I{I? g,e?T —b v…–D?hR QúN?Qh?èv…内置变量。这些内置的变量可以在awkz ^?N-_ u(b O?e9? O?Y?? O`S?N?R)u(nrS?‘?W(j!_ S9‘MN-c [?

]?O\? 围,也可以通过修改记录分隔符rs让一个特殊字符而不是换行符作为记录的分隔符。

例:显示文本文件myfileN-{,N ?LR0{,SAN”?LN-N?[W{&%R –”v…{,N [Wkμ? {,N [WkμT?{,N [Wkμ?

awk -f % 'nr==7,nr==15 {printf $1 $3 $7}'

awkv…内置函数

awkNKb@N?b 为一种优秀的程序设计语言的原因之一是它吸收了某些优秀的程序设计语言(例如c? 语言的许多优点。这些优点之一就是内置函数的使用,awk[?NI^ve/c N?N |?R v…内置函数,由于这些函数的使用,使得awkcDO?v…R?€yf?为完善和

强大,例如,awkO?u(N?N |?R v…[W{&N2Y t内置函数(这些函数看起来与c语言的字符串处理函数相似,其使用方式与c语言

中的函数也相差无几)? k cf/u1N?这些内置函数的使用,使awkY t[W{&N2v…R?€yf?R _:Y'0 g,e?T —bv…–D录中列有一般的

awkb@cDO?v…内置函数,这些内置函数也许与你的awkrHg,g N?QúQe? Vàkd? W(O?u(NKRM? g Y}S?€ N N O`v…|?~?N-v…€Tg: ^.R?0

O\为内置函数的一个例子,我们将在这里介绍awkv…printfQy数,这个函数使得awkN c语言的输出相一致。实际上,awkN-g 许多引用形式都是从c语言借用过来的。如果你熟悉c语言,你也许会记得其中的printfQy数,它提供的强大格式输出功能曾经带我们许多的方便。幸运的是,我们在awkN-SèT?[?‘í?"N?0 a wkN-printfQàNNN c语言中一模一样,如果你熟悉c语言的话,你完全可以照c语言的模式使用awkN-v…printf0 VàkdW(这里,我们只给出一个例子,如果你不熟悉的话,请随便找一本c语言的入门书翻翻。

例:显示文件myfileN-v…?LS÷T?{,3[Wkμ?

$awk '{printf"%03d%s\n",nr,$1}' myfile

W(T}N??LO?u(awk

c q g顺序,我们应当讲解awkz ^???计的内容了,但在讲解之前,我们将用一些例子来对前面的知识进行回顾,这些例子都

是在命令行中使用的,由此我们可以知道在命令行中使用awkf/Y N Hv…e1O?0 这样做的原因一方面是为下面的内容作铺垫,

另一方面是介绍一些解决简单问题的方法,我们完全没有必要用复杂的方法来解决简单的问题----eaq6awkcDO?N?较为简单的方法的话。

例:显示文本文件mydocS9‘M? T+g ?[W{&N2"sun"v…b@g ?L0

$awk '/sun/{print}' mydoc

u1N?显示整个记录(全行)是awkv…?:w R¨O\? VàkdS?N?w u eaction项。

$awk '/sun/' mydoc

O?? N—bf/N N*较为复杂的匹配的示例:

$awk '/[ss]un/,/[mm]oon/ {print}' myfile

[?将显示第一个匹配sunb s unv…?LN {,N N*S9‘Mmoonb m oonv…?LNK??v…?L? ^v显示到标准输出上。

O?? N—bv…y:O?显示了内置变量和内置函数length? ?v…O?u(?

$awk 'length($0)>80 {print nr}' myfile

该命令行将显示文本myfileN-b@g ?…过80N*[W{&v…?LS÷? W(这里,用$0?hy:etN*记录(行),同时,内置变量nrN O?u(标志符'$'0

例:作为一个较为实际的例子,我们假设要对unixN-v…u(b7进行安全性检查,方法是考察/etcN v…passwde?N?? 检查其中的passwd[Wkμ? {,N?[Wkμ? f/T&为"*"? Y?N 为"*"? 则表示该用户没有设置密码,显示出这些用户名(第一字段)。我们可以

用如下语句实现:

#awk -f: '$2=="" {printf("%s no password!\n",$1' /etc/passwd

W(这个示例中,passwde?N?v…[WkμR –”{&f/"? "? Vàkd? _?须用-f? 来更改默认的字段分隔符,这个示例中也涉及到了内置

函数printfv…O?u(0

awkv…S?‘?

Y?T Q v[?z ^???计语言一样,awkQA许在程序语言中设置变量,事实上,提供变量的功能是程序设计语言的其本要求,不提供变量的程序设计语言本人还从未见过。

awkcDO?N$yíS?‘?? N yíf/awk内置的变量,这前面我们已经讲过,需要着重指出的是,与后面提到的其它变量不同的是,

在awkz ^?N-_ u(内置变量不需要使用标志符"$"? VT忆一下前面讲过的nrv…O?u(? 0a wkcDO?v…S?N yíS?‘?f/?ê[?NIS?‘?0

awkQA许用户在awkz ^?语句中定义并调用自已的变量。当然这种变量不能与内置变量及其它awkOYuY[Wv?T ?W(awkN-_ u(?ê[?NIS?‘?_?须在它前面加上标志符"$"0 N c语言不同的是,awkN-N —‰?对变量进行初始化,awkh9cnQvW(awkN-{,N k!Qú

现的形式和上下文确定其具体的数据类型。当变量类型不确定时,awk??认其为字符串类型。这里有一个技巧:如果你要让你的awkz ^?w??SO`b@O?u(v…S?‘?v…f x n|{W?? O`应当在在程序中给它赋初值。在后面的实例中,我们将用到这一技巧。

?D{—N R$断:

作为一种程序设计语言所应具有的特点之一,awke/c Y yí?D{—? 这些运算与c语言提供的几本相同:如+0 -0 *0 /0 %{I

{I? T时,awkN_e/c c语言中类似++0 --0 +=0 -=0 =+0 =-NK|{v…R?€y? 这给熟悉c语言的使用者编写awkz ^?带来了极大的

方便。作为对运算功能的一种扩展,awk还提供了一系列内置的运算函数(如log0 s qr0 c os0 s in{I{I? T?N N?u(N?对字符串

进行操作(运算)的函数(如length0 s ubstr{I{I? 0这些函数的引用大大的提高了awkv…?D{—R?€y0

O\为对条件转移指令的一部分,关系判断是每种程序设计语言都具备的功能,awkN_N O?Y 0a wkN-QA许进行多种测试,如常用的==? {IN?? 0?=? N{IN?? 0>? Y'N?? 0=? Y'N?{IN?? 0>=? \N?{IN?? {I{I? T时,作为样式匹

配,还提供了~? S9‘MN?? T?? ~? N S9‘MN?? R$断。

作为对测试的一种扩充,awkN_e/c u(逻辑运算符:!(—^)0 &&? N?0||? b?T?bìS÷? ?进行多重判断,这大大增强了awk

v…R?€y0 g,e?v…–D录中列出了awkb@QA许的运算、判断以及操作符的优先级。

awkv…mAz c§R6

mAz c§R6语句是任何程序设计语言都不能缺少的部分。任何好的语言都有一些执行流程控制的语句。awkcDO?v…[?Y v…mAz c§R6语句类似于c语言,这给我们编程带来了极大的方便。

10 b eginT?end:

W(awkN-N$N*ry别的表达式,beginT?end? 这两者都可用于patternN-? S?€ R M—bv…awk语法),提供beginT?endv…O\u(f/给程序赋予初始状态和在程序结束之后执行一些扫尾的工作。任何在beginNKT R Qúv…díO\? W({}内)将在awk开始扫描输入之前执行,而endNKT R Qúv…díO\将在扫描完全部的输入之后执行。因此,通常使用begin来显示变量和预置(初始化)变量,使用end来输出最终结果。 O?? }/计销售文件xsN-v…销售金额(假设销售金额在记录的第三字段):

$awk

>'begin { fs=":";print "~?计销售金额";total=0}

>{print $3;total=total+$3;}

>end {printf "销售金额总计:%.2f",total}' sx

? lè? >f/shellcDO?v…{,N?cDy:{&? Y?‰?W(shellz ^?awk语句和awk语言中换行,则需在行尾加反斜杠\?

W(这里,begin预置了内部变量fs? [WkμR –”{&? T??ê[?NIS?‘?total,T 时在扫描之前显示出输出行头。而end则在扫描完成后

打印出总合计。

20 m Az c§R6语句

awkcDO?N?[?Y v…mAz c§R6语句,其用法与c语言类似。下面我们一一加以说明: 2.10 i f...else语句:

格式:

if(?h??_ )

语句1

else

语句2

h<_ N-"语句1"S?N?f/Y N*语句,如果你为了方便awkR$断也方便你自已阅读,你最好将多个语句用{}bì?w来。awkR g?结构

允许嵌套,其格式为:

if(?h??_ 1?

{if(?h??_ 2?

语句1

else

语句2

}

语句3

else {if(?h??_ 3)

语句4

else

语句5

}

语句6

当然实际操作过程中你可能不会用到如此复杂的分枝结构,这里只是为了给出其样式罢了。

2.20 w hile语句

格式为:

while(?h??_ )

语句

2.30 d o-while语句

格式为:

do

{

语句

}while(gaN?R$断语句) 2.40 f or语句

格式为:

for(R Y??h??_ ;终止条件;ke???h??_ )

{语句}

W(awkv… while0 d o-whileT?for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出。break N-断当前正在执行的循环并跳到循环外执行下一条语句。continueN?当前位置跳到循环开始处执行。对于exitv…执行有两种情况:当exit语句不在endN-时,任何操作中的exitT}N??h现得如同到了文件尾,所有模式或操作执行将停止,endj!_ N-v…díO\??执行。而出现在endN-v…exit将导致程序终止。

例:为了

awkN-v…?ê[?NIQy数

定义和调用用户自己的函数是几乎每个高级语言都具有的功能,awkN_N O?Y ?O FS?Y?v…awk^vN cDO?Qy数功能,只有在nawkb 较新的awkrHg,N-bMS?N?X?R Qy数。

Qy数的使用包含两部分:函数的定义与函数调用。其中函数定义又包括要执行的代码(函数本身)和从主程序代码传递到该函数的临时调用。

awkQy数的定义方法如下:

function Qy数名(S?数表){

Qy数体

}

W(gawkN-QA许将functionw u e为func? O FQv[?rHg,v…awkN Q A许。函数名必须是一个合法的标志符,参数表中可以不提供参数(但在调用函数时函数名后的一对括号仍然是不可缺少的),也可以提供一个或多个参数。与c语言相似,awkv…S?数也是通过值来传递的。

在awkN-调用函数比较简单,其方法与c语言相似,但awkk?c语言更为灵活,它不执行参数有效性检查。换句话说,在你调用函数时,可以列出比函数预计(函数定义中规定)的多或少的参数,多余的参数会被awkb@_yue? €N?3v…S?数,awk将

它们置为缺省值0b z z[W{&N2? Q wOS?n为何值,将取决于参数的使用方式。

awkQy数有两种返回方式:隐式返回和显式返回。当awk执行到函数的结尾时,它自动地返回到调用程序,这是函数是隐式返回的。如果需要在结束之前退出函数,可以明确地使用返回语句提前退出。方法是在函数中使用形如:return ??VTP< h<_ v…语句。

O?? N—bv…O?[Po y:N?Qy数的使用。在这个示例中,定义了一个名为print_headerv…Qy数,该函数调用了两个参数filenameT?pagenum? f ilenameS?数传给函数当前使用的文件名,pagenumS?数是当前页的页号。这个函数的功能是打印(显示)出当前文件的文件名,和当前页的页号。完成这个功能后,这个函数将返回下一页的页号。

nawk

>'begin{pageno=1;file=filename

>pageno=print_header(file? p ageno)? #调用函数print_header

>printf("当前页页号是:%d\n",pageno);

>}

>#[?NIQy数print_header

>function print_header(filename,pagenum){

>printf("%s %d\n",filename,pagenum); >pagenum++;return pagenum;

>}

>}' myfile

执行这个程序将显示如下内容:

myfile 1

当前页页号是:2

awk??级输入输出

1.读取下一条记录:

awkv…next语句导致awk读取下一个记录并完成模式匹配,然后立即执行相应的操作。通常它用匹配的模式执行操作中的代码。next导致这个记录的任何额外匹配模式被忽略。

2.简单地读取一条记录

awkv… getline语句用于简单地读取一条记录。如果用户有一个数据记录类似两个物理记录,那么getline将尤其有用。它完成一般字段的分离(???n[WkμS?‘?$0 fnr nf nr)0 Y?g?b R?则返回1? Y1败则返回0? R0??e?N?\>? 0Y?g?— 简单地读取一个文

件,则可以编写以下代码:

例:示例getlinev…O?u(

{while(getline==1)

{

#process the inputted fields

}

}

N_S?N?O?getlineOY[X?“Qe数据在一个字段中,而不是通过使用getline variablev…_b_ Y t N?,[Wkμ0 当使用这种方式时,nf???nb 0? f nrT?nr??X?P<0

u(b7N_S?N?O?u(getline<"filename"e1_ N?N N*给定的文件中输入数据,而不是从命令行所列内容输入数据。此时,getline将完成一般字段分离(设置字段变量$0T?nf)0 Y?g?e?N?N [XW(? ??VT-1,b R?? ??VT1,??VT0?hy:Y1败。用户可以从给定文件中读取数据到一个变量中,也可以用stdin(标准输入设备)或一个包含这个文件名的变量代替filename0 P<_—lèa v…f/当使用这种方式时不修改fnrT?nr0

S?N yíO?u(getline语句的方法是从unixT}N?c¥S×?“Qe? O?Y?N —bv…O?[P:

O?? y:O?N?unixT}N?c¥S×?“Qe

{while("who -u"|getline)

{

#process each line from the who command

}

}

当然,也可以使用如下形式:

"command" | getline variable

3.关闭文件:

awkN-QA许在程序中关闭一个输入或输出文件,方法是使用awkv…close语句。

close("filename")

filenameS?N?f/getlinebS开的文件(也可以是stdin,S T+e?N?T v…S?‘?b €g etlineO?u(v…xnR T}N?? 0b N N*?“Qúe?N?? S?N?

f/stdout? S T+e?N?T v…S?‘?b O?u({??Sv…xnR T}N?? 0

4.?“QúR0N N*e?N?:

awkN-QA许用如下方式将结果输出到一个文件:

printf("hello word!\n")>"datafile"

b

printf("hello word!\n")>>"datafile"

5.?“QúR0N N*T}N?

awkN-QA许用如下方式将结果输出到一个命令:

printf("hello word!\n")|"sort-t','"

awkN s hell scriptm÷T 编程

因为awkS?N?O\为一个shellT}N?O?u(? Vàkdawk€yN s hellbyY t z^?_?Y}v…??T W(N ?w? 这给实现awkN s hellz ^?v…m÷T 编程

提供了可能。实现混合编程的关键是awkN s hell scriptNK??v…对话,换言之,就是awkN s hell scriptNK??v…Oá`oN¤mA:awkN?shell scriptN-获取所需的信息(通常是变量的值)、在awkN-执行shellT}N??L0 s hell script将命令执行的结果送给awkY t N?Sêshell script读取awkv…执行结果等等。

1.awk读取shell scriptz ^?S?‘?

在awkN-b 们可以通过"'$S?‘?T '"v…e1_ 读取sell scrpitz ^?N-v…S?‘?0

O?? W(N —bv…y:O?N-? b们将读取sell scrpitz ^?N-v…S?‘?name? 该变量存放的是文本myfilev…d°写者,awk将打印出这个人

名。

$cat writename

:

# @(#)

#

.

.

.

name="张三" nawk 'begin {name="'name'";\ printf("\t%s\td°写者%s\n",filename,name");}\

{...}end{...}' myfile

.

.

.

2.将shellT}N?v…执行结果送给awkY t

O\为信息传送的一种方法,我们可以将一条shellT}N?v…结果通过管道线(|? 传递给awkY t?

O?? y:O?awkY t s hellT}N?v…执行结果

$who -u | awk '{printf("%skcW(执行%s\n",$2,$1)}'

该命令将打印出注册终端正在执行的程序名。

3.shell scriptz ^?读awkv…执行结果为了实现shell scriptz ^?读取awk执行的结果,我们可以采取一些特殊的方法,例如我们可

以用变量名=`awk语句`v…_b_ 将awk执行的结果存放入一个shell scriptS?‘?0 当然也可以用管道线的方法将awk执行结果传递

给shell scriptz ^?Y t0

O?? O\为传送消息的机制之一,unixcDO?N?N N*T Q vb@g u(b7传送消息的命令wall? a`f/write to all写给所有用户),该命

令允许向所有工作中的用户(终端)发送消息。为此,我们可以通过一段shellbyY t z^?wall.shell来模拟这一程序(事实上

比较老的版本中wall\1f/N kμshellbyY t z^??

$cat wall.shell

:

# @(#) wall.shell:S?? m?`o给每个已注册终端

#

cat >/tmp/$$

#u(b7录入消息文本 who -u | awk '{print $2}' | while read tty

do

cat /tmp/$$>$tty

done

W(这个程序里,awkc¥S×who -uT}N?v…执行结果,该命令打印出所有已注册终端的信息,其中第二个字段是已注册终端的设备名,因此用awkT}N?g?Qú该设备名,然后用while read tty语句循环读出这些文件名到变量(shell scriptS?‘?? t tyN-? O\为信息传送的终结地址。

4.W(awkN-执行shellT}N??L----]LQeQy数system()

system()f/N N*N ?T[W{&b 数字类型的嵌入函数,该函数的功能是处理作为参数传递给它的字符串。system对这个参数的

处理就是将其作为命令处理,也就是说将其当作命令行一样加以执行。这使得用户在自己的awkz ^?— ‰?时可以灵活地执行命令或脚本。

例:下面的程序将使用system]LQeQy数打印用户编制好的报表文件,这个文件存放在名为myreport.txtv…e?N?N-0 为简约起见,我们只列出了其end?èR ?

.

.

.

end {close("myreport.txt");system("lp myreport.txt");}

W(这个示例中,我们首先使用close语句关闭了文件myreport.txte?N?? q6T O?u(system]LQeQy数将myreport.txt? Q ebSSpg:bS Sp0

写到这里,我不得不跟朋友们说再见了,实在地说,这些内容仍然是awkv…R k ew?识,电脑永远是前进的科学,awkN_N O?Y ?g,{?b@€yPZv…Sêf/W(O`RM?Lv…o+o+??? N-铺平一段小小开端,剩下的路还得靠你自己去走。老实说,如果本文真能给你前行的路上带来些许的方便,那本人就知足了!

如对本篇有任何疑问,请e-mail to:chizlong@https://www.doczj.com/doc/d816167300.html,b R0N;?uhttps://www.doczj.com/doc/d816167300.html,N-uY? 0

–D录:

1.awkv…^8规表达式元字符

\ 换码序列

^ W([W{&N2v…开头开始匹配

$ W([W{&N2v…结尾开始匹配

. N N?OU单个字符串匹配

[abc] N []内的任一字符匹配

[a-ca-c] N a-cSêa-c? 围内的字符匹配(按字母表顺序)

[^abc] N –d[]内的所有字符以外的任一字符匹配

desk|chair N d eskT?chairN-v…N?N N*S9‘M

[abc][def] 关联。与a0 b0 c N-v…N?N [W{&S9‘M? N Q vT ‰???d0 e0 f N-v…N?N N*[W{&0

* N a0 b b c N-N?N N*Qú现0k!b Y k!v…[W{&v?S9‘M

+ N a0 b b c N-N?OUN N*Qú现1k!b Y k!v…[W{&v?S9‘M

? N N N*zzN2b a0 b b c W(N?OUN N*[W{&v?S9‘M

? b lue|black? b erry T ^v^8规表达式,与blueberryb b lackberryv?S9‘M

2.awk{—术运算符

运算符 u(?

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

x^y xv…yk!^B

x**y T N

x%y 计算x/yv…OY数(求模)

x+y xR y

x-y xQ?y

x*y xNXy

x/y x–dy

-y 负y(yv…开关符号);N_称一目减

++y yR 1T O?u(y(RM?nR ?

y++ O?u(yP

--y yQ?1T O?u(y(RM?nQ??

y-- O?u(T y Q?1(T 缀减)

x=y 将yv…P<赋给x

x+=y 将x+yv…P<赋给x

x-=y 将x-yv…P<赋给x

x*=y 将x*yv…P<赋给x

x/=y 将x/yv…P<赋给x x%=y 将x%yv…P<赋给x

x^=y 将x^yv…P<赋给x

x**=y 将x**yv…P<赋给x

3.awkQA许的测试:

操作符 T+NI

x==y x{IN?y

x!=y xN {IN?y

x>y xY'N?y

x>=y xY'N?b {IN?y

x

x<=y x\ N?b {IN?y?

x~re xS9‘Mkc则表达式re?

x!~re xN S9‘Mkc则表达式re?

4.awkv…díO\{&(c O Q H级升序排列)

= 0 +=0 -=0 *= 0 /= 0 %=

||

&&

> >= < <= == != ~ !~

xy ([W{&N2连结,'x''y'S?b "xy"?

+ -

* / %

++ --

5.awk内置变量(预定义变量)

说明:表中v项表示第一个支持变量的工具(下同):a=awk? n=nawk,p=posix awk,g=gawk

v S?‘? T+NI ?:w P<

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

n argc T}N??LS?数个数

g argind 当前被处理文件的argv标志符

n argv T}N??LS?数数组

g convfmt 数字转换格式 %.6g

p environ unix环境变量

n errno unix|?~?错误消息

g fieldwidths ?“Qe[Wkμ宽度的空白分隔字符串

a filename 当前输入文件的名字

p fnr 当前记录数

a fs ?“Qe[WkμR –”{& zzh<

g ignorecase c§R6Y'\ 写敏感0? Y'\ 写敏感)

a nf 当前记录中的字段个数

a nr ]ò~?读出的记录数

a ofmt 数字的输出格式 %.6g

a ofs ?“Qú[WkμR –”{& zzh<

a ors ?“Qúv…记录分隔符 e°?L

a rs ?“Qev…记录他隔符 e°?L

n rstart ??S9‘MQy数匹配的字符串首

n rlength ??S9‘MQy数匹配的字符串长度

n subsep N 标分隔符 "\034"

6.awkv…内置函数

v Qy数 u(? b??VTP<

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

n gsub(reg,string,target) k?k!^8规表达式regS9‘M时替换targetN-v…string

n index(search,string) ??VTstringN-searchN2v…OM?n

a length(string) lBN2stringN-v…[W{&N*数

n match(string,reg) ??VT^8规表达式regS9‘Mv…stringN-v…OM?n

n printf(format,variable) h<_ S?“Qú? c f ormatcDO?v…h<_ ?“QúS?‘?variable0

n split(string,store,delim) h9cnR u L{&delim,R ‰?string为storev…数组元素

n sprintf(format,variable) ??VTN N*S T+WúN?formatv…h<_ S数据,variablesf/‰?e>R0N2N-v…数据

g strftime(format,timestamp) ??VTN N*WúN?formatv…e?g b€时间串,timestmpf/systime()Qy数返回的时间n sub(reg,string,target) {,N k!当常规表达式regS9‘M? f?换targetN2N-v…[W{&N2

a substr(string,position,len) ??VTN N*N?position开始lenN*[W{&v…[PN2

p totower(string) ??VTstringN-对应的小写字符

p toupper(string) ??VTstringN-对应的大写字符

a atan(x,y) xv…OYR (_'^|)

n cos(x) xv…OY_&(_'^|)

a exp(x) ev…x^B

a int(x) xv…et数部分

a log(x) xv…?êq6对数值

n rand() 0-1NK??v…–?g:数

n sin(x) xv…kc_&(_'^|)

a sqrt(x) xv…^se1h9

a srand(x) R Y?S –?g:数发生器。如果忽略x? 则使用system() g system() ??VT?ê1970^t1g 1e?N?来经过的时间(按秒计算)转载于网络

wc详解

wc命令参数及用法详解 wc命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。 语法:wc [选项] 文件... 说明:该命令统计指定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所指定文件的总统计数。下面让我们来简单的看一下其支持的参数及其代表的含义。 参数及含义 举例 demo.txt Welcome to https://www.doczj.com/doc/d816167300.html, 欢迎来到这里 wc -cwl demo.txt #2 4 39 demo.txt 顺序依次是l w c 强调 这里面大家要注意一点。m和c参数是不能共存的,只有一个可以起作用,看哪个参数在后面。例如: wc -c demo.txt #39 demo.txt wc -m demo.txt #33 demo.txt wc -cml demo.txt #2 33 demo.txt wc -cm demo.txt #33 demo.txt 结果为m的值哦

举一反三 需要把一个文件的行数存在另一个文件里。可是这个wc还会同时输出文件名。咋办?简单,用管道处理一下OK啦 wc -l demo.txt | awk 'BEGIN{FS=" "}{print $1}' 这样,我们就把想要的文件行数给取到了,至于存在另一个文件里,我们可以把awk的print结果重定向到文件。 重要提示 用wc处理文件的时候,一定要在文件末尾存在换行符,否则统计的行数是不正确的。当然多几个换行符是没有问题的。 echo "UNIX" | wc -l # 1 echo -n "UNIX" | wc -l # 0 echo "UNIX\n\n\n" | wc -l # 1 今天看到的命令是:ls -l | wc -l 用来统计当前目录下的文件数

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命令来做目录备份

ls -l命令详解

有几个字段老是记不住,就记载这里吧 ls -l 列表信息详解 我们平时用ls -l 命令查看一个目录下的文件和子目录的详悉信息时,会得到一个详细的文件和目录名列表.这个列表包含了文件的属性,所属用户,所属组,创建时间,文件大小等等信息.这些信息到底是什么意思呢?有很多初学者对这些不太了解,因此想详悉讲解一下用ls -l命令得到的文件列表每一个字段的意思 以笔者电脑的/root目录为例: [root@gucuiwen root]# ll 总用量 4055 -rw-r--r-- 1 root root 1581 11月 24 18:14 anaconda-ks.cfg drwxr-xr-x 2 root root 208 12月 1 13:50 babylinux -rw-r--r-- 1 root root 1474560 11月 25 15:02 babylinux.img -rw-r--r-- 1 root root 26829 11月 25 15:10 babylinux.png lrwxrwxrwx 1 root root 9 1月 4 11:06 disk1.link.png -> disk1.png -rw-r--r-- 1 root root 3209 11月 26 12:07 disk1.png -rw-r--r-- 1 root root 692 11月 26 13:16 disk2.png -rw-r--r-- 1 root root 718 11月 26 13:30 disk3.png drwx------ 8 root root 392 1月 4 08:40 evolution -rwxr-xr-x 1 root root 13695 11月 30 16:51 fangkuai.sh drwxr-xr-x 2 root root 208 12月 28 12:06 FreeBSD -rw-r--r-- 1 root root 2315 11月 25 17:19 getMBR.png brw-r----- 1 root root 3, 1 1月 4 11:06 hda1 drwxr-xr-x 2 root root 296 12月 31 11:53 htmls -rw-r--r-- 1 root root 21369 11月 24 18:12 install.log -rw-r--r-- 1 root root 3024 11月 24 18:12 install.log.syslog -rw-r--r-- 1 root root 293 1月 4 10:51 ls.txt -rw-r--r-- 1 root root 2237702 11月 25 15:09 magick.miff -rw-r--r-- 1 root root 13493 11月 25 17:31 mbr1.png -rw-r--r-- 1 root root 8123 11月 25 17:42 mbr2.png -rw-r--r-- 1 root root 512 11月 30 16:10 mbr.dat -rw-r--r-- 1 root root 64512 11月 26 15:33 partition.doc -rw-r--r-- 1 root root 49887 11月 26 15:32 partition.sxw -rw-r--r-- 1 root root 1541 12月 18 13:14 passwd -rw-r--r-- 1 root root 46320 11月 25 17:28 Screenshot-1.png -rw-r--r-- 1 root root 44145 11月 25 17:32 Screenshot-2.png -rw-r--r-- 1 root root 43732 11月 25 17:13 Screenshot.png drwxr-xr-x 3 root root 72 1月 4 10:49 test -rw-r--r-- 1 root root 0 12月 18 10:44 tset crw-r----- 1 root root 4, 65 1月 4 11:08 ttyS1

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命令详解 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读取输入的下一行,继续重复步骤③和④,这个过程一

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是一个强大的文本分析工具,相对于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

linux下cat命令详解1

cat命令的用途是连接文件或标准输入并打印。这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用 1.命令格式: cat [选项] [文件]... 2.命令功能: cat主要有三大功能: 1.一次显示整个文件:cat filename 2.从键盘创建一个文件:cat > filename 只能创建新文件,不能编辑已有文件. 3.将几个文件合并为一个文件:cat file1 file2 > file 3.命令参数: -A, --show-all 等价于-vET -b, --number-nonblank 对非空输出行编号 -e 等价于-vE -E, --show-ends 在每行结束处显示$ -n, --number 对输出的所有行编号,由1开始对所有输出的行数编号 -s, --squeeze-blank 有连续两行以上的空白行,就代换为一行的空白行 -t 与-vT 等价 -T, --show-tabs 将跳格字符显示为^I -u (被忽略) -v, --show-nonprinting 使用^ 和M- 引用,除了LFD 和TAB 之外 4.使用实例: 实例一:把log2012.log 的文件内容加上行号后输入log2013.log 这个文件里 命令: cat -n log2012.log log2013.log 输出: 代码如下: [root@localhost test]# cat log2012.log 2012-01 2012-02 ======[root@localhost test]# cat log2013.log 2013-01 2013-02

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

AIX常用命令

AIX常用命令 目录操作 命令名功能描述使用举例 mkdir 创建一个目录mkdir dirname rmdir 删除一个目录rmdir dirname mvdir 移动或重命名一个目录mvdir dir1 dir2 cd 改变当前目录cd dirname pwd 显示当前目录的路径名pwd ls 显示当前目录的内容ls -la dircmp 比较两个目录的内容dircmp dir1 dir2 文件操作 命令名功能描述使用举例 cat 显示或连接文件cat filename pg 分页格式化显示文件内容pg filename more 分屏显示文件内容more filename od 显示非文本文件的内容od -c filename cp 复制文件或目录cp file1 file2 rm 删除文件或目录rm filename mv 改变文件名或所在目录mv file1 file2 ln 联接文件ln -s file1 file2

find 使用匹配表达式查找文件find . -name "*.c" -print file 显示文件类型file filename 选择操作 命令名功能描述使用举例 head 显示文件的最初几行head -20 filename tail 显示文件的最后几行tail -15 filename cut 显示文件每行中的某些域cut -f1,7 -d: /etc/passwd colrm 从标准输入中删除若干列colrm 8 20 file2 paste 横向连接文件paste file1 file2 diff 比较并显示两个文件的差异diff file1 file2 sed 非交互方式流编辑器sed "s/red/green/g" filename grep 在文件中按模式查找grep "^[a-zA-Z]" filename awk 在文件中查找并处理模式awk '{print $1 $1}' filename sort 排序或归并文件sort -d -f -u file1 uniq 去掉文件中的重复行uniq file1 file2 comm 显示两有序文件的公共和非公共行comm file1 file2 wc 统计文件的字符数、词数和行数wc filename nl 给文件加上行号nl file1 >file2 安全操作 命令名功能描述使用举例

相关主题
文本预览
相关文档 最新文档