Awk 命令

创作人 Leo


编辑时间 Wed Jan 1,2020 at 10:13


Awk 命令

简介

awk 现在linux一般使用 gawk 版本 (gnu版)

gawk 是一个模式扫描及处理语言。缺省情况下它从标准输入读入并写至标准输出。

范例:

        gawk '{ sum += $1 }; END { print sum }' file

        gawk -F: '{ print $1 }' /etc/passwd



POSIX 选项:                     GNU 长选项:

        -f 脚本文件             --file=脚本文件

        -F fs                   --field-separator=fs

        -v var=val              --assign=var=val

        -m[fr] val

        -O                      --optimize

        -W compat               --compat

        -W copyleft             --copyleft

        -W copyright            --copyright

        -W dump-variables[=file]        --dump-variables[=file]

        -W exec=file            --exec=file

        -W gen-po               --gen-po

        -W help                 --help

        -W lint[=fatal]         --lint[=fatal]

        -W lint-old             --lint-old

        -W non-decimal-data     --non-decimal-data

        -W profile[=file]       --profile[=file]

        -W posix                --posix

        -W re-interval          --re-interval

        -W source=program-text  --source=program-text

        -W traditional          --traditional

        -W usage                --usage

        -W use-lc-numeric       --use-lc-numeric

        -W version              --version



基础命令

awk -F域分割符(默认空格) ‘命令正文’ 待处理文件(可多个)

例:

tail error.log |awk ‘{print $1 “ ” $3 “ ” $4}’

内置变量

ARGC 命令行参数个数

ARGV 命令行参数排列

ENVIRON 支持队列中系统环境变量的使用

FILENAME awk浏览的文件名

FNR 浏览文件的记录数

FS 设置输入域分隔符,等价于命令行 -F选项

NF 浏览记录的域的个数

NR 已读的记录数

OFS 输出域分隔符

ORS 输出记录分隔符

RS 控制记录分隔符

此外,$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,……以此类推。

例:

[root@localhost logs]# tail error.log |awk '{print NR}'

1

2

3

4

5

6

7

8

9

10

print和printf

awk中同时提供了print和printf两种打印输出的函数。

其中print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。

printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。

例:

[root@localhost ~]# cat test.txt | awk -F'|' '{print $1 " " $2 " " $3 " " $4}'

100     lucy    20.3    beijing middle school

120     jack    12.98   japen middle school

310     lixin   20      chongqing school

21      chen    10.5389178      huahua school

12      lala    3.1415926       londong school

[root@localhost ~]# cat test.txt | awk -F'|' '{printf("%s %s %s %s ", $1, $2, $3, $4)}'

100     lucy    20.3    beijing middle school

120     jack    12.98   japen middle school

310     lixin   20      chongqing school

21      chen    10.5389178      huahua school

12      lala    3.1415926       londong school

[root@localhost ~]# cat test.txt | awk -F'|' '{printf("%s %s %.2f %s ", $1, $2, $3, $4)}'

100     lucy    20.30   beijing middle school

120     jack    12.98   japen middle school

310     lixin   20.00   chongqing school

21      chen    10.54   huahua school

12      lala    3.14    londong school


变量和赋值

例:将某个段的数值改变

[root@localhost ~]# cat test.txt | awk -F'|' '{count++} {m=$3+100} {printf("%d %s %s %.2f %s ", count, $1, $2, m, $4)}'

1       100     lucy    120.30  beijing middle school

2       120     jack    112.98  japen middle school

3       310     lixin   120.00  chongqing school

4       21      chen    110.54  huahua school

5       12      lala    103.14  londong school


例:统计某个段(可用用来做统计分析)

[root@localhost ~]# cat test.txt|awk -F'|' '{count+=$3}{print count}'

20.3

33.28

53.28

63.8189

66.9605

也可以使用各种运算符


[root@localhost ~]# cat test.txt|awk -F'|' '{count+=$3}{print count, count/3}'

20.3 6.76667

33.28 11.0933

53.28 17.76

63.8189 21.273

66.9605 22.3202

循环

例:

[root@localhost ~]# cat test.txt|awk -F'|' '{for(i=0;i<$1;i++){print i}}'

0

1

2

3

4

...

例:循环打印偶数


[root@localhost ~]# cat test.txt|awk -F'|' '{for(i=0;i<$1;i++){ if(i%2==0){print i}  }}'

0

2

4

6

8

10

12

14

判断

例:

[root@localhost ~]# cat test.txt|awk -F'|' '{if ($1>=200)  print $2,"gt 200"; else if ($1>=100 && $1<200) print $2, "gt 100"; else  print $2, "lt 100" }'

lucy gt 100

jack gt 100

lixin gt 200

chen lt 100

lala lt 100

使用示例

例:统计文件中某个ID的出现次数


[root@localhost ~]# cat test.txt

100|lucy|20.3|beijing middle school

120|jack|12.98|japen middle school

310|lixin|20|chongqing school

100|lucy|20.3|beijing middle school

21|chen|10.5389178|huahua school

12|lala|3.1415926|londong school

310|lixin|20|chongqing school

310|lixin|20|chongqing school

[root@localhost ~]# wc -l test.txt

8 test.txt

[root@localhost ~]# cat test.txt|awk -F'|' '{arr[$1]++} {if(NR>=8){for(a in arr){print a,"=",arr[a]}}}'

100 = 2

120 = 1

310 = 3

12 = 1

21 = 1

例:统计ID保存到数组,并排序


[root@localhost ~]# cat test.txt|awk -F'|' '{arr[$1]++} {if(NR>=8){for(a in arr){print a,"=",arr[a] | "sort -r -n -k3";}}}'

310 = 3

100 = 2

21 = 1

12 = 1

120 = 1


阅读:1166
搜索
  • Linux 高性能网络编程库 Libevent 简介和示例 2332
  • Mac系统编译PHP7【20190929更新】 2208
  • zksync 和 layer2 1899
  • Hadoop 高可用集群搭建 (Hadoop HA) 1891
  • Linux 常用命令 1878
  • 安徽黄山游 1855
  • Windows 安装Swoole 1815
  • 小白鼠问题 1785
  • Hadoop 高可用YARN 配置 1784
  • 使用 Java+Thrift 实现异步事件处理服务 1684
简介
不定期分享软件开发经验,生活经验