AWK 简明教程

之前对awk的使用一直停留在截取某列打印出来的水平上,最近简单学习了一下awk,发现这个东西还是比较强大的,这里总结一下.

awk的基本使用

awk是一个非常好的行文本处理器,支持从标准输入接收数据,结果输出至标准输出.比如我们可以这么用:

cat a.txt|awk '{print $2}'

上面这行的意思是将每行的第二列打印出来.默认分隔符是空格或者tab.当然我们可以通过F参数来修改.

cat a.txt|awk -F , '{print $2}'

上面这行就将分隔符改为了逗号.
观察awk后面的部分,可以明显看出,这就是一段脚本.既然是脚本,那么当脚本过长,在命令行直接编写肯定是不够方便的.
所以awk支持指定某一个脚本文件来处理.比如我们可以这么干:
新建一个文件,名字为awktst,内容如下:

{print $2}

我们可以将上面的脚本改为:

cat a.txt|awk -F , -f awktst

awk的基本结构

awk是基于行文本的处理工具,当我们将文本流输入awk的时候,awk其实是在不停的重复处理同一行.其结构主要分为三部分:Begin,body,END.
处理的过程伪码如下:

BEGIN{
     #init something before start text reading
 }
 while((line = readline())!=null){
     body{
         #the main awk process is here
     }
 }
 END{
     #do something after read end
 }

 

我们只需要编写BEGIN,body和END过程就好了.

每部分都用大括号来标识自己的代码块.需要注意的是,awk的变量作用域是全局的,而和代码块没关系.

还是上面的例子,我们可以再将awktst改写的更高端一些:

BEGIN{FS = ","} #FS是awk的一个默认变量,代表标示符
#下面这个其实就是body
{print $2}

我们执行的命令就可以改为:

cat a.txt|awk -f awktst

awk的参数和变量

可以看到,上面我们用到了$2来表示第二列,其实awk在分割上还有两个常用的变量,既
$0 表示整行
$NF 倒数第一列

我们也能自己定义参数,定义很简单:

a = 1
a = 'a'
a = "abcd"
a[b]=c #map形式

awk的语法

awk语法和c/java非常像,下面有个小例子,看一下应该就明白

k1 = "Chris";
k2 = "John";
age[k1] = 30;
age[k2] = 29;
 
for (ke in age){
    if (ke == "Chris"){
        val = age[ke];
        print "Hello Chris , your age is ",val;
    }
}

一个简单的例子:

#这是一个处理java异常日志的小脚本.作用是将今天的异常全部输出.
#java异常文件是一个第一列为日期的时间顺序文件,所以我们只要找到第一个今天的异常,然后将剩下的直接输出即可.

BEGIN {"date +%Y-%m-%d"|getline now;nowStart = 0}
{
    if($1 == now){
        nowStart = 1
    }
    if(nowStart == 1){
        print
    }
 
}

这是另外一个简单的例子

#有文件类似:
name salary age
chris 1000 30
john 1100 24
#我们希望获取薪水总和,平均年龄

BEGIN{
    personCount = 0;
    salarySum = 0;
    ageSum = 0;
    rowCount = 0;
}
{
    if(rowCount != 0 ){#第一行是表头,不处理
        salarySum += $2;
        ageSum += $3;
        personCount ++;
    }
    rowCount ++;
 
}
END{
    print "Total salary is :",salarySum;
    print "Average age is :",(ageSum/personCount);
}
$ cat person | awk -f awktst
Total salary is : 2100
Average age is : 27

从Ubuntu迁移至OS X.

前些日子把Ubuntu从1204升级至1304后,问题多多.
教训就是Ubuntu最好一直用LTS,如果实在要升级,建议重装,在原系统上Update实在不是一个好建议.

之前就一直很心仪OS X,这次就趁着机会入手了Macbook pro.

到目前用了一个礼拜,现在说说和ubuntu的区别.

1.OS X对文件的”剪切”不是特别提倡,拖动到另外一个文件夹的默认动作是拷贝.

2.OS X对于复制文件夹的目标目录中,假如存在同名文件夹的默认处理很怪异,它会删掉原文件夹,再把新的拷贝进去.而不是windows和ubuntu默认的那样是合并两者.

3.OS X默认没有类似apt-get或者yum这样的工具,可以安装ports或者homebrew,我看很多人都推荐brew,所以就跟大流了.用起来brew install XXX,除了不用sudo,其他和apt-get没什么区别.

4.mac把我们熟悉的ctrl键的功能拆成了commad和control,平时用起来command用的比较多.比如command-C,command-V,command-S,command-A,所以也没什么太大区别.但是,但是,对于我这个用惯了vim的同学来说,稍微有点分裂,因为在别的应用都是用command多,而到了vim中,又要大量的使用control,还是要适应一段时间,反正这一个礼拜了,现在用起来还得很刻意的注意一下到底是该用command还是control,没有之前用ubuntu那么行云流水.

5.OS X上软件质量都很高,远超ubuntu,对比windows也毫不逊色.对于非windows程序员来说,用这个完成日常工作问题不大.IDE,数据库管理器都有很好的软件.(虽然正版价格昂贵,但是破解版挺容易找,罪过罪过)

6.虽然OS X也是unix大家族的一员,但是有些在linux上好好的开源软件到OS X上可能会有问题,而且开源社区解决的速度远不如linux~比如今天就遇到的thrift 0.9.1在OS X最新的Mavericks上build失败的问题,社区说将留到0.9.2解决,我看了一眼bug,现在还是unresolved状态,鬼知道什么时候能搞定.

7.开发人员拿到OSX的第一件事最好是装X Code.里面集成了很多有用的东西,省的自己一个一个装,比如svn.

8.OS X默认读取的是~:.bash_profile,而不是ubuntu默认的~:.bashrc.经测试ubuntu的配置文件拷过来改个名字就能用.

———————————————————-

最后推荐一些我觉得mac上还不错的软件:

QQ,旺旺,QQ音乐,有道笔记,迅雷,有道词典,百度云同步盘.

iterm2 用来替代原生的终端.

textmate用来替代原生的文本编辑器(据说最新版已经开源).

Navicat数据库神器~

通过命令行提交bugzilla

python-bugzilla 是一个用于操作Bugzilla的命令行工具。
如何安装
以RHEL6为例

# wget ftp://rpmfind.net/linux/epel/6/x86_64/python-bugzilla-0.9.0-1.el6.noarch.rpm
# yum install python-magic
# rpm -ivh python-bugzilla-0.9.0-1.el6.noarch.rpm

除此之外还需要python的bugzilla和requests的module

解压后,到各自的目录执行:

sudo python setup.py build

sudo python setup.py install

安装好之后就有一个命令行工具 /usr/bin/bugzilla
如何使用
Bugzilla有非常多的功能,具体功能请 man bugzilla,这里仅以创建新Bug为例说明用法:

# bugzilla –bugzilla=http://bugzilla.youserver.com/xmlrpc.cgi –user=xxxx –password=xxxxx new –product=test-website –version=unspecified –component=test –summary=”test python bugzilla” –comment=”create bug for test”