上一次修改时间:2015-11-14 15:24:52

awk使用示例

  1. 常用内建变量

  2. $0    当前记录(这个变量中存放着整个行的内容)
    $1~$n    当前记录的第n个字段,字段间由FS分隔
    FS    输入字段分隔符 默认是空格或Tab
    NF    当前记录中的字段个数,就是有多少列
    NR    已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
    FNR    当前记录数,与NR不同的是,这个值会是各个文件自己的行号
    RS    输入的记录分隔符, 默认为换行符
    OFS    输出字段分隔符, 默认也是空格
    ORS    输出的记录分隔符,默认为换行符
    FILENAME    当前输入文件的名字
  3. 用awk处理net.txt文件,规则:第1到10行中,第二列的值等于3,并格式化输出结果,顺带输出行号(NR,FNR都是行号)

  4. [pikaqiu@bogon awk]$ awk 'NR>0&&NR<11&&$2==3{printf"%-4s%-4s%-8s%-6s%-10s\n",NR,FNR, $1,$2,$6}' net.txt    
    6   6   unix    3     CONNECTED 
    7   7   unix    3     CONNE:CTED
    8   8   unix    3     CONNECTED 
    9   9   unix    3     CONNE:CTED
    10  10  unix    3     CONNECTED
  5. 文件分割示例

    #第五列的值只有DGRAM和STREAM两种且没有空白行

    #第六列的值只有CONNECTED和CONNE:CTED两种,但该列中间有大量空白行,每个空白行都会被拆分为一个单独的文件,

    #即使两个空白行是连续的,也会被拆分成两个文件

  6. [pikaqiu@bogon awk]$ awk 'NR!=1{print > $5}' net.txt 
    [pikaqiu@bogon awk]$ ls
    DGRAM  net.txt  STREAM  test.txt
    [pikaqiu@bogon awk]$ awk 'NR!=1{print > $6}' net.txt 
    [pikaqiu@bogon awk]$ ls
    10977  1252   12651  15226  16884  17593  18628  21459  22610  24916  CONNECTED   net.txt
    11341  1254   12652  15981  16950  17703  19530  21933  23744  25757  CONNE:CTED  STREAM
    11933  12641  15221  16758  17336  18475  19964  22031  23761  25931  DGRAM       test.txt
  7. 判断第6列的值,如果为CONNECTED,则放到1.txt文件中,如果为CONNE:CTEN则放到2.txt中,如果都不是则放到3.txt文件中;

  8. [pikaqiu@bogon awk]$ awk 'NR!=1{if($6 ~ /CONNECTED/)print > "1.txt";
    > else if($6 ~ /CONNE:CTED/)print > "2.txt"; 
    > else print > "3.txt" }'  net.txt
  9. 统计文件夹的大小,或该文件夹下某种类型文件的大小

  10. [pikaqiu@bogon shell]$ ll | awk '{sum+=$5}END{print sum}'
    634071
    [pikaqiu@bogon shell]$ ll *.sh| awk '{sum+=$5}END{print sum}'
    2106