awk:强大的文本分析工具 Linux

Quibbler 2020-3-28 1003

awk:强大的文本分析工具


        熟悉Linux的就不都不知道awk命令,校招的时候还被问道过awk命令的一些用法。awk取自三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

        把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。更多命令参考《Linux 命令大全》

    awk '{[pattern] action}' {filenames}


1、简单用例

        长时间不用很容易忘,看看简单的一些用法。演示数据test.txt,内容如下:

	Beth    4.00    0
	Dan     3.75    0
	kathy   4.00    10
	Mark    5.00    20
	Mary    5.50    22
	Susie   4.25    18


1.1、输出某一列

        查看某一列数据,打印{pinrt $n}

    //输出第二列数据
    awk '{print $2}' test.txt
    
    //输出如下
    4.00
    3.75
    4.00
    5.00
    5.50
    4.25


1.2、输出符合条件的列数据

        这时就用到了action

    //输出第三列大于10的,却打印出对应的第二列数据
    awk '$3 > 10 {print $2}' test.txt
    
    //输出如下
    5.00
    5.50
    4.25


1.3、打印第一列和最后一列数据

        第一列数据好或得,$0即可。最后一列呢?如果不知道有多少列怎么获取$n。还好awk有内建变量NF,可以使用,详细参考第三节。

    //需要 , 分开
    awk '{print $1 ,  $NF}' test.txt
    
    //输出如下
    Beth 0
    Dan 0
    kathy 10
    Mark 20
    Mary 22
    Susie 18


1.4、一行有多少列

        awk有内建变量NF

    //使用NF内建变量
    awk '{print NF}' test.txt
    
    //输出如下
    3
    3
    3
    3
    3
    3


1.5、行号

        内建变量, 叫做 NR

    //输出第三列大于10的,带上行号
    awk '$3 > 10 {print NR , $NF}' test.txt
    
    //输出如下
    4 20
    5 22
    6 18


1.6、计算

        对列与列之间的数据进行计算

    //第二、三列数据相乘
    awk '{print $2 * $3}' test.txt
    
    //输出如下
    0
    0
    40
    100
    121
    76.5


2、awk全部选项

POSIX选项                        GNU长选项:(标准)

        -f progfile                        --file=progfile

        -F fs                                 --field-separator=fs

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


Short选项                         GNU长选项:(扩展名)

        -b                                     --characters-as-bytes

        -c                                     --traditional

        -C                                    --copyright

        -d[file]                             --dump-variables[=file]

        -D[file]                             --debug[=file]

        -e 'program-text'            --source='program-text'

        -E file                               --exec=file

        -g                                     --gen-pot

        -h                                     --help

        -i includefile                    --include=includefile

        -l library                           --load=library

        -L[fatal|invalid]                --lint[=fatal|invalid]

        -M                                   --bignum

        -N                                    --use-lc-numeric

        -n                                     --non-decimal-data

        -o[file]                              --pretty-print[=file]

        -O                                    --optimize

        -p[file]                             --profile[=file]

        -P                                     --posix

        -r                                      --re-interval

        -s                                     --no-optimize

        -S                                     --sandbox

        -t                                      --lint-old

        -V                                     --version


3、awk内置变量

        awk内置变量,引用菜鸟教程《Linux awk 命令》

$n当前记录的第n个字段,字段间由FS分隔
$0完整的输入记录
ARGC命令行参数的数目
ARGIND命令行中当前文件的位置(从0开始算)
ARGV包含命令行参数的数组
CONVFMT数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
ERRNO最后一个系统错误的描述
FIELDWIDTHS字段宽度列表(用空格键分隔)
FILENAME当前文件名
FNR各文件分别计数的行号
FS字段分隔符(默认是任何空格)
IGNORECASE如果为真,则进行忽略大小写的匹配
NF一条记录的字段的数目
NR已经读出的记录数,就是行号,从1开始
OFMT数字的输出格式(默认值是%.6g)
OFS输出记录分隔符(输出换行符),输出时用指定的符号代替换行符
ORS输出记录分隔符(默认值是一个换行符)
RLENGTH由match函数所匹配的字符串的长度
RS记录分隔符(默认是一个换行符)
RSTART由match函数所匹配的字符串的第一个位置
SUBSEP数组下标分隔符(默认值是/034)


参考资料:

        AWK入门指南

        Linux awk命令详解


不忘初心的阿甘
最新回复 (0)
    • 安卓笔记本
      2
        登录 注册 QQ
返回
仅供学习交流,切勿用于商业用途。如有错误欢迎指出:fluent0418@gmail.com