Awk 之我见

来源:互联网 发布:淘宝买机油 编辑:程序博客网 时间:2024/06/05 16:22
Awk 之我见
****************************************
author: hjjdebug
date:   Thu Jun 12 12:42:50 CST 2014
****************************************
1.三剑客
****************************************
曾闻grep,sed,awk是linux 文本处理了不起的三剑客。
认识了awk, 发现awk功能上可以替代grep,sed. 当然,相同的功能需要多写一点点代码。
awk 支持正则表达式,所以可以取代grep
awk 内嵌sub,gsub函数,所以可以取代sed.

grep /regular/  支持--color, -w, -v 等选项
awk '/regular/{print}', match(s,r,[,a]) 与之抗衡。

sed 's///' 一招定天下
awk  sub(r,s,[,t]) gsub(r,s,[,t]) gensub(r,s,h,[,t]) 灵活替换。

awk 有数组,有流程。 为百变字符串提供可能。

****************************************
2. awk 之优缺点。
****************************************
--------------------------------------------------------------------------------
a. awk 是一门编程语言, 但不是一门完善的语言。
它内嵌函数未提供的功能,你也很难突破这种限制。
因为它并不能够通过外部修补来扩充它的能力。
--------------------------------------------------------------------------------
例如,若gawk 不扩充strtonum 实现数制转换,
你就无法把16进制字符串
变成数据。看下面例子。
//只支持常规10进制字符串。根据上下文区别是数据还是字符串
[hjj@hjj ~]$ awk 'BEGIN{a="0x2f";printf "%d\n", a}'  
0
//能够把16进制字符串变为数据。 如果你想把32进制字符串变成数据,那就对不起了。
[hjj@hjj ~]$ awk 'BEGIN{a="0x2f";b=strtonum(a);printf "%d\n", b}'
47
曾经想写一个自己的str2num, 发现几乎不能,因为awk 不支持字符, if('A'<=v) 的写法是错误的。

--------------------------------------------------------------------------------
b.  特定关键字
    awk 没有字符概念,只有字串概念。
    所以'A' 的写法是不会出现的,只有"A",'' 用来在命令行下包含整个awk 命令

    awk {} 是语句块指示。同时也是扩充正则表达式+?{}元字符。
--------------------------------------------------------------------------------
c.  awk 能够在乱军之中取上将首级,如探囊取物。
    awk 擅长于文本处理,基于它的正则能力,替换能力和数组能力及编程能力
   但你不能指望它做socket, 做驱动处理。它不提供接口,你也无从实现。

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


----------------------------------------
awk 语言学习. 基本步骤及技能
----------------------------------------
1. 能够输出内容,
    典型应用,  会打印hello world
     awk 'BEGIN{print "hello"}'
    awk 'BEGIN{printf("%d\n"),56+0x21}'

2. 会使用变量,能进行计算和流程控制。条件表达式
    典型应用, 会打印ascii 码表, 以字符形式输出整形变量。
    awk 'BEGIN{a=0;for(i=0;i<10;i++)a+=i; print a;}'
    awk 'BEGIN{for(i=0x20;i<0x80;i++){if(i%16==0)printf("\n");printf("%c",i);}}'

3. 会使用内置函数。
    典型应用. "this is a test string", 字符串增,删,改,查。正则匹配。
    echo "this is a test string"  |awk '{for(i=1;i<=NF;i++)print $i;}'


4. 复杂运算: 构建数组,查表操作等:
    典型应用, 玩转ascii 码表,字符串对应的字节流,字节流对应的字符串等。
    echo "abd" | awk -F "" 'BEGIN{for(i=0;i<=128;i++)a[sprintf("%c",i)]=i;}{for(i=1;i<=NF;i++)print a[$i];}'

5. 会处理命令行参数, 会处理文件等:    
   典型应用, 可以与用户交互了。

扩展:
函数: 是一段固定的以形参为局部变量操作代码,有返回值。 函数的存在是为了结构化和重用代码。
awk 的变量都是全局的,除了函数形参是局部的.
每一门语言有它特定的运行环境和适应范围,有它生存的价值,体会到各语言的差异(优略势)是更高的要求。
支持每一种语言的都有其内置的函数库或类库,熟练的前提是熟悉这些内置的功能


0 0
原创粉丝点击