关闭

awk 初学01

标签: awk
68人阅读 评论(0) 收藏 举报
分类:

环境是在linux下


file.awk文件可以直接在命令行下通过  awk -f file.awk [file path] 来运行

当然awk语句可以直接在命令行下使用


目前学到得东西:

整体分为:

BEGIN {
}
{
}
END {
}

其中BEGIN是在对文件处理之前,进行的一些初始化,定义,规范之类的。

第二个部分主要就是对文件的处理行为。

END是对文件处理完成之后做的事情。


awk '{print $0}' /etc/passwd

这样可以直接在终端运行,显示出/etc/passwd中得内容  $0就是对应文件每行的内容  $1 $2 就是第一个参数,第二个参数  置于分隔符,可以在文件file.awk中通过FS来设置或者通过在命令行通过-F来设置 ,如:awk -F":" '{print $0} /etc/passwd  这样就是根据 ":”  来分割成不同的$1 $2...

对于print动作,当然也可以输出与文件内容无关的东西,这个无所谓。过程就是对文件的每一行都执行同样的动作。

关于print  这个和C相似,但是更简单一些。不用格式可以直接输出。如果输出多个可以这样:print $1 "\t" $2 "\t content" 。


对于file.awk

一些常见的变量

NF:显示字段数量,就是多少行,通过这个变量可以控制你所要输出的某些航

NR:记录号,每个字段的参数数量,就是$0 $1 $2....最后一个可以是哪个


FS:来设置分隔符

RS:来设置字段结束的位置 和FS一起使用可以根据将几行当做一个记录来处理


/indexId/ {print $0}  这样输出包含indexId的字段

可以使用if来改写这个

if($1 ~/indexId/) {
	print $0
}

在awk中~表示匹配的意思  !~表示不匹配

if($0 !~ /indexId) 这样就可以输出 所有不包含indexId的所有字段

awk中可以使用C中得运算符和逻辑符号

允许if的嵌套,这样由C转过来学习awk的人就会很容易掌握。


一个可以统计一个文件中有多少空行的小代码:

BEGIN{
    x=0
}
{
    if($0 ~/^$/){
        x+=1
    }
}
END {
    print x
}

/^$/ 就是这个字段开始就是$,$就是结束符的意思


在awk中所有的变量都是字符串化的

x="2.01"
y=3.00

这样x+y是可以直接计算的,按照浮点进行计算并返回结果。



关于FS RS

FS用来设置分隔符,可以使用正则里边的东西

比如:

FS="\t+"
FS="[[:space:]+]"
第一个是以多个tab来作分隔符

第二个是以多个空格来做分隔符

如果以及几个数字做分隔符可以这样

FS="[0-9]+"
这样就是以几个数字作为分隔符


如果我们希望把多行当做一个整体可以使用FS RS一起实现

BEGIN {
    FS="/n"
    RS=""
}
每一行当做一个参数,一个空行作为结束

OFS ORS

如果我们希望在输出时候,中间插入某些特定的符号,以区分输出的字段

可以设置OFS,不设置,默认是直接连接。

在  BEGIN中设置即可

ORS 是用来区分字段的,默认是换行。


循环

do {

}while();

while() {

}

BEGIN {
        OFS=" "
        mystring = "How are you doing today?"
    }

for(x=1;x<10;x++){}

这三个和C并没有区别,注意里边的语法就可以了。


awk同样支持数组,array[0]="jdkjaf"

遍历数组

for(x in array) {
    print array[x]
}

这样可以把数组中得内容输出出来,但是这样有个问题就是x不一定是从1开始,他开始的位置是随机的,进行一次遍历,可能是1-9  可能是  4-9-3这样

判断某一个下标的元素是否存在于数组中,可以是用in来判断

awk的格式化输出printf() sprintf()  和C语言的相同。

awk的字符串操作:

      print length(mystring)
      print index(mystring, "you")
      print tolower(mystring)
      print toupper(mystring)
      print substr(mystring, 9, 3)
  
      print match(mystring, /you/),RSTART,RLENGTH
  
      sub(/o/, "O", mystring)
      print mystring
      mystring = "How are you donging today?"
      gsub(/o/, "O", mystring)



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:816次
    • 积分:24
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:4篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档