AWK 常见基本用法

来源:互联网 发布:如何删除数据库中的表 编辑:程序博客网 时间:2024/05/21 11:37

在Linux下进行一些简单的文本处理, 尤其是涉及数据基本过滤加工汇总的,awk 十分方便, 复杂的处理还是用python比较好。总结一下一些 awk 的常用技巧:

按列条件过滤

awk '{print $1, $3}' info.txt         # 输出指定列awk '$2==1 && $5=="ERROR"' info.txt   # 按条件过滤,$2是内置变量,表示第二列awk '$2>1' info.txt                   # 按条件过滤,如果列为数字,其大小可以作为比较条件

行号

awk '$2==1 && $5=="INFO" || NR==1'                            # 内置变量NR:表示行号awk '$2>2 && NR!=1 {printf "line:%u %s\n", FNR, $0}' info.txt # 内置变量FNR:表示文件行号

指定分隔符

awk -F: '{print $1,$3}' info.txt       # -F 指定列分隔符,缺省是空格或tab,这里制定冒号awk -F '[:,]' '{print $1,$3}' info.txt # -F 制定多个列分隔符

格式化输出

awk '$2==0 || NR==1 {printf "%-10s %-10s\n",$1,$5}' info.txt  ## printf 用法同C语言中的

字符串匹配

awk '/mode/' info.txt                     # 匹配含mode的行,引号可不输,类似 grep mode info.txtawk '!/mode/' info.txt                    # 匹配不含mode的行,类似于 grep -v 的用法awk '/mode|mode2/' info.txt               # 匹配含mode或者mode2的行,正则匹配用法awk '$12 ~ /work/ {print $12}' info.txt   # 第12列匹配work,指定列进行字符串匹配awk '$12 !~ /work/ {print $12}' info.txt  # 第12列不匹配work,类似于 grep -v 的用法

拆分重定向

awk 'NR!=1{print > $2}' info.txt      # 按照第2列进行拆分,第二列一样的内容重定向到以第二列命名的文件里

简单的统计

awk '{sum+=$2} END {print sum}' info.txt # 求第二列的和,END表示处理完毕所有行root@ubuntu:/media/psf/Home/iLearning/tmp# cat info.txtUSER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMANDroot         2  0.0  0.0      0     0 ?        S    Mar13   0:01 [kthreadd]root         3  0.0  0.0      0     0 ?        S    Mar13   0:05  \_ [ksoftirqd/0]root         5  0.0  0.0      0     0 ?        S<   Mar13   0:00  \_ [kworker/0:0H]root         7  0.0  0.0      0     0 ?        S    Mar13  22:07  \_ [rcu_sched]root@ubuntu:/media/psf/Home/iLearning/tmp# awk '{sum+=$2} END {print sum}' info.txt  17

参考

AWK 简明教程
The GNU Awk User’s Guide

0 0