Awk 之我见

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 是一门编程语言,
--------------------------------------------------------------------------------
//awk根据上下文区别是数据还是字符串
[hjj@hjj ~]$ awk 'BEGIN{a="0x2f";printf "%d\n", a}'  
0
//strtonum能够把16进制字符串变为10进制数据。
[hjj@hjj ~]$ awk 'BEGIN{a="0x2f";b=strtonum(a);printf "%d\n", b}'

47

如果你想把32进制字符串变成10进制数据,那能不能做到呢?。

曾经想写一个自己的str2num, 发现几乎不能,因为awk 不支持字符, if('A'<=v) 的写法是错误的。

时隔很久以后,发现可以用一种变通的方法写str2num 函数, 方法是通过构建一个hash 数组, 然后对每一位进行转化,累加计算!

可以写任何进制转10进制,,可见人的认识在特定的条件下也是有局限性的, 随着认识的加深, 会突破这种限制!!

awk 语法类c,但不是强类型语言, 变量,函数参数无类型声明, 多余的函数参数可以用作局部变量.


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

    awk {} 是语句块指示。同时也是扩充正则表达式+?{}元字符。
--------------------------------------------------------------------------------
c.  awk 能够在乱军之中取上将首级,如探囊取物。

 

    awk 擅长于文本处理,基于它的正则能力,替换能力和数组能力及编程能力 

 

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

 

----------------------------------------
awk 语言学习. 基本步骤及技能
----------------------------------------
1. 能够输出内容,(输入最自然的是行输入,也可以在启动时用-v定义变量)
    典型应用,  会打印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. 会处理命令行参数, 会处理文件等:    
   典型应用, 可以与用户交互了。

6. awk 调试,  目前未发现专门的调试工具, 你可以多加几个print 来打印变量. awk -d 选项也能导出变量,供你分析参考.
扩展:
函数: 是一段固定的以形参为局部变量操作代码,有返回值。 函数的存在是为了结构化和重用代码。
awk 的变量都是全局的,除了函数形参是局部的.
每一门语言有它特定的运行环境和适应范围,有它生存的价值,体会到各语言的差异(优略势)是更高的要求。
支持每一种语言的都有其内置的函数库或类库,熟练的前提是熟悉这些内置的功能

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值