每日一点Linux之Linux命令(7) -- awk

awk

作用

处理文本文件,文本分析

按行筛选,输出指定列

更适合格式化文本,对文本进行较复杂格式处理

官方文档:http://www.gnu.org/software/gawk/manual/gawk.html

语法

命令行

awk [选项参数][--help][--version] 'script' var=value file(s)

--help:查看帮助
--version:版本说明

参数

  • -F fs or --field-separator fs
    指定字符串或正则分割

    # 先用空格分割,再用,分割,按分割后分组取出第一二列
    awk -F '[ ,]' 'printf $1,$2' filename
    
  • -v vkey=value
    赋值一个用户定义变量

    # 输出第一列,和第一列加1,如果为数字,增加1,如果为字符串替换成1
    awk -va=1 '{print $1,$1+a}' log.txt
    
  • -f scripfile
    从脚本文件中读取awk命令

    awk -f test.awk filename
    
  • -W re-interval
    允许间隔正则表达式的使用

POSIX 选项:		GNU 长选项:(标准)
	-f 脚本文件		--file=脚本文件
	-F fs			--field-separator=fs
	-v var=val		--assign=var=val
短选项:		GNU 长选项:(扩展)
	-b			--characters-as-bytes
	-c			--traditional
	-C			--copyright
	-d[文件]		--dump-variables[=文件]
	-D[文件]		--debug[=文件]
	-e '程序文本'	--source='程序文本'
	-E 文件			--exec=文件
	-g			--gen-pot
	-h			--help
	-i 包含文件		--include=包含文件
	-l 库		--load=库
	-L[fatal|invalid]	--lint[=fatal|invalid]
	-M			--bignum
	-N			--use-lc-numeric
	-n			--non-decimal-data
	-o[文件]		--pretty-print[=文件]
	-O			--optimize
	-p[文件]		--profile[=文件]
	-P			--posix
	-r			--re-interval
	-S			--sandbox
	-t			--lint-old
	-V			--version

Tips

  • 行匹配语句 awk只能用单引号

  • 输出指定列

    # 格式化输出1、4列
    awk '{printf "%-8s%-10s\n" $1,$4}' filename
    # 输出第1列大于2的行
    awk '$1>2' log.txt
    
  • 正则匹配

    # 输出包含xx的行
    awk '/xx/' filename
    # 输出不包含xx的行
    awk '!/xx/' filename
    
  • 忽略大小写

    awk 'BEGIN{IGNORECASE=1} /xx/' filename
    
  • AWK的hello world程序为:

    BEGIN { print "Hello, world!" }
    
  • 计算文件大小

    $ ls -l *.txt | awk '{sum+=$6} END {print sum}'
    --------------------------------------------------
    666581
    
  • 从文件中找出长度大于80的行

    awk 'length>80' log.txt
    
  • 运算符

    运算符 描述
    = += -= *= /= %= ^= **= 赋值
    ?: C条件表达式
    || 逻辑或
    && 逻辑与
    ~ 和 !~ 匹配正则表达式和不匹配正则表达式
    < <= > >= != == 关系运算符
    空格 连接
    + - 加,减
    * / % 乘,除与求余
    + - ! 一元加,减和逻辑非
    ^ *** 求幂
    ++ -- 增加或减少,作为前缀或后缀
    $ 字段引用
    in 数组成员
  • 内建变量(可以直接printf)

    变量 描述
    $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)
  • 内置函数

    https://www.runoob.com/w3cnote/awk-built-in-functions.html

脚本

规则

  • BEGIN{ 执行前的语句 }
  • {处理每一行时要执行的语句}
  • END {处理完所有的行后要执行的语句 }

数组

array_name['indexstr']=value
  • 可以通过key有规律的定义模拟二维数组
  • 使用 asort 完成数组元素的排序
  • 使用 asorti 实现数组索引的排序

判断语句

if (condition)
    {action-1};
else if (condition)
	{action-2};
else
    {action-3};

循环语句

for (initialisation; condition; increment/decrement)
    {action} break/continue
while (condition)
    {action}

函数

function function_name(argument1, argument2, ...)
{
    function body
}

猜你喜欢

转载自www.cnblogs.com/yangjunh/p/Linux_awk.html