免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1271 | 回复: 0
打印 上一主题 下一主题

awk简介 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-29 16:02 |只看该作者 |倒序浏览


NR当前记录的数
NF在当前记录中字段的数目可
FNR目前操作的记录数

FS 输入字段分隔符 #缺省为空格
RS 输入记录分隔符 #缺省为新行(\n)

OFS 输出字段分隔符 #缺省为空格
ORS 输出记录分隔符 #缺省为新行(\n)


FILENAME 包含当前输入文件的名字。

1.必须是单引号,告知内容是awk的program,不被shell解释

2.在 print 语句中用逗号分隔的项,在输出的时候会用当前OFS输出字段分隔符(缺省为空格)隔开。没有用逗号分隔的项会串联起来,

3.如果记录分隔符为空,把空输入行作为记录分隔符,并把空格、tab 和换行作为字段分隔符处理。

4.赋值,可以放到模式也可以放在动作,那到底是模式还是动作 放到模式里,生效并打印;放到动作里,就生效不打印了;   5.控制流语句只能放在 {}内 ,可看成一个  模式 { 动作 }控制流语句的动作最好被花括号括住,以免出现错误,逻辑也清晰控制流语句可以复合使用,这时{}对于清晰的逻辑更发挥了作用 garylv@linux:~/tmp> more test.txt aa bbcc ddff gggarylv@linux:~/tmp> awk ' $1=="aa" {print $0} {if($1=="cc") {print $0}} ' test.txt    aa bbcc dd  awk -F":" '{if($2=="0"){ $2=6; if($1==00) { $1=23} else {$1=$1-1}; if($1 6.赋值,关系表达式必须用双引号,不然会理解成变量,未定义的变量为空缺省的,(不是内置的)变量被初始化为空字符串,它有为零的数值  garylv@linux:~/tmp> echo ""|awk 'var=cc {print var}'  garylv@linux:~/tmp> echo ""|awk 'var="cc" {print var}'  cc  


1.介绍
1.1程序结构
awk 程序是如下形式的语句序列:
模式 { 动作 }
模式 { 动作 }
...
输入的每行都要依次针对每个模式做匹配。对于每个匹配的模式,执行相关的动作。在所有模式都已经测试过了的时候,取回下一行并从头开始做匹配。
如果 BEGIN 出现,它必须是第一模式;END 必须是最后一个模式,如果用到了的话。
每个模式动作后可以 紧跟,空格,分号;
模式或动作二者都可以但不能同时省略。如果一个模式没有动作,简单的把匹配的行复制到输出。(所以匹配多个模式的行可能被打印多次)。如果一个动作没有模式,则这个动作在所有输入上进行。不匹配模式的行被忽略。
因为模式和动作都是可选的,动作必须被包围在花括号中来区别于模式;
1.2. 记录和字段

可以使用可选的命令行参数 −Fc 来设置 FS 为字符 c (可不加引号并可紧跟)

如果记录分隔符为空,把空输入行(或连续空输入行)作为记录分隔符,并把空格、tab 和换行作为字段分隔符处理: 可以用来删除空行


1.3.打印

        在 print 语句中用逗号分隔的项,在输出的时候会用当前输出字段分隔符分隔开。没有用逗号分隔的项会串联起来

输出可以被转向到多个文件中;程序
  { print $1 >"foo1"; print $2 >"foo2" }
写第一个字段 $1 到文件 foo1中,写第二个字段到文件 foo2 中。还可以使用 >> 符号:
  print $1 >>"foo"
添加输出到文件 foo。(在每种情况下,输出文件都在必要时建立)。文件名可以是一个变量或字段,同常量一样;例如
  print $1 >$2

2. 模式
(1)正则表达式,(2)算术关系表达式,(3)字符串值的关系表达式,(4)和它们的任意的布尔组合。
2.1. BEGIN 和 END
如果 BEGIN 出现,它必须是第一模式;END 必须是最后一个模式,如果用到了的话。
2.2. 关系表达式
   awk 模式可以是涉及常用的关系算符 、、==、!=、>=、> 的关系表达式。
2.4. 模式的组合
   模式可以是模式的使用算符 ||(或)、&&(与)和 !(非)的任意布尔组合

2.5. 模式范围
选择一个动作的“模式”还可以由用逗号分隔的两个模式组成,比如
pat1,pat2{}
在这种情况下,这个动作在 pat1 的一个出现和 pat2 的下一个出现之间(包含它们)的每个行上进行

3. 动作
awk 动作是用换行或分号终止的动作语句的序列。
3.1. 内置函数
某个内置函数的名字,不带有参数或圆括号,表示这些函数在整个记录上的值。
函数 sprintf(f, e1, e2, ...) 在 f 指定的 printf 格式中生成表达式 e1、e2 等的值。所以例子
x = sprintf("%8.2f %10ld", $1, $2)
awk 还提供 printf 语句用于输出格式化:
   printf format expr, expr, ...
依据在 format 中的规定格式化在列表中的表达式并打印它们。例如,
   printf "%8.2f  %10ld\n", $1, $2不自动生成输出分隔符;你必须自己增加它们,如这个例子那样。这个版本的 printf 同于 C 语言所使用的。  
3.2. 变量、表达式和赋值
awk 变量依据上下文而被接纳为数值(浮点数)或字符串值缺省的,(不是内置的)变量被初始化为空字符串,它有为零的数值 在数值上下文中,不能被解释为数的字符串一般会有为零的数值,但是依靠这种行为是愚蠢的。 算术在内部以浮点数的方式计算。算术算符有 +、-、*、/、%(模)。C 语言的增加 ++ 和减少 −− 算符也可用,还有赋值算符 +=、-=、*=、/=、%=。这些算符都可以用于表达式中。   awk 'BEGIN{RS=""}NR%2'    // 删除xml注释
awk '!a[$1]++'                       // 去重


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/103643/showart_2164220.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP