AWK用法整理

时间:2022-09-10 13:17:52

printf "1:2::3:::4::::5" awk -F '[:]+' '{print $4}'

[:]+ 表示1个或多个 :(冒号)作为分隔符

ip  addr  |awk  -F  '[ ]+'  'NR==8  {print $3}' | awk -F  '/'  '{print $1}

NR==8  {print $3}   表示第8行的第3列 

cat haproxy.log-20170102 |sed -n '/Jan  1 14:00:00/,/Jan  1 14:05:00/p'|grep 'packet/index'|awk '{print $6}'|cut -d : -f1|sort| uniq -c |sort -k1,1nr|awk '{ SUM += $1 } END { print SUM }'  对第一个字段进行汇总求和

-------------------------------------------------------------

说明:

awk被设计用于数据流,能够对列和行进行操作。而sed更多的是匹配,进行替换和删除。
awk有很多内建的功能,比如数组,函数等。灵活性是awk的最大优势。

awk的结构
awk '
BEGIN{ print "start"} 
pattern { commands } 
END{ print "end"}'
file
为了偏于观看,我打了回车,实际上是一行

一个awk脚本通常是3部分
1. BEGIN语句块
2. 能够使用模式匹配的通用语句块
3. END语句块
他们任何一部分都可以不出现在脚本中。脚本通常包含在双引号或者单引号内。
例如:

  1. awk 'BEGIN{i=0}{i++}END{print i}' filename

工作原理

awk命令的工作方式如下:

1. 执行BEGIN{commands}语句块中的语句

2. 从文件或者stdin中读取一行,然后执行pattern{commands}. 迭代直到全部读取完毕

3. 最后执行END{commands}语句块

再次提醒,他们任何一部都可以没有

awk的功能也远不止如此

入门实例:

  1. echo | awk '{var1="v1";var2="v2";var3="v3"; print var1,var2,var3;}'
  2. 打印: v1 v2 v3

解释:逗号为定界符(分隔符)

  1. echo | awk '{var1="v1";var2="v2";var3="v3"; print var1"-"var2"-"var3;}'

打印v1-v2-v3

解释:双引号为连接符

其他任何符号,都不能正常输出v1,v2,v3

解读--help(一个非常庞大复杂的帮助文档,官方用了410页的篇幅PDF来介绍,如果我只言片语,你信我自己都不信。。)

用法: awk [POSIX 或 GNU 风格选项] -f 脚本文件 [--] 文件 ... 
用法: awk [POSIX 或 GNU 风格选项] [--] '程序' 文件 ... 
POSIX 选项:             GNU 长选项: 
    -f 脚本文件        --file=脚本文件 
    -F fs            --field-separator=fs
指定输入文本分隔符,fs是一个字符串或者是一个正则表达式, 
    -v var=val        --assign=var=val
将外部变量值付给var 
    -m[fr] val 
    -O            --optimize
启用一些优化程序的内部表示。 
    -W compat        --compat
在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。 
    -W copyleft        --copyleft
打印简短的版权信息 
    -W copyright        --copyright
打印短版的通用公共许可证,然后退出 
    -W dump-variables[=file]    --dump-variables[=file]
打印全局变量,其类型,提交的最终值的排序列表。 
    -W exec=file        --exec=file
与-f类似,但与他有两点不同,(我回头把相关文档上传,太长) 
    -W gen-po        --gen-po
(内容太多) 
    -W help            --help 打印帮助 
    -W lint[=fatal]        --lint[=fatal]
警告可疑或不移植到其他的awk实现的结构 
    -W lint-old        --lint-old
打印关于不能向传统unix平台移植的结构的警告 
    -W non-decimal-data    --non-decimal-data
启用自动输入数据的解释,八进制和十六进制值 
    -W profile[=file]    --profile[=file]
启用awk程序剖析 
    -W posix        --posix
在严格意义上的POSIX模式运作。 
    -W re-interval        --re-interval
允许间隔表达式在正则表达式上 
    -W source=program-text    --source=program-text 
    -W traditional        --traditional
传统的Unix awk的正则表达式匹配 
    -W usage        --usage 
    -W use-lc-numeric    --use-lc-numeric
解析数字输入时,强制使用的语言环境中的小数点字符 
数据
 -W version        --version
提交错误报告请参考“gawk.info”中的“Bugs”页,它位于打印版本中的“Reporting 
Problems and Bugs”一节

注意:gawk是awk的GNU版本,即使help ,在ubuntu下也需要先安装gawk


这回我们就不解读了,为了增加大家的信息和乐趣,先来点基本的:

部分特殊变量:

NR: 表示记录数量,在执行过程中对应于行号

NF:表示字段数量,在执行过程中对应于当前行的字段数

$0: 这个变量包含执行过程中当前行的文本内容

$1: 第一个字段的文本内容

$2: 第二个字段的文本内容

例子:

例1.

  1. echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7"|\#这个\是在窗口中写多行命令用的
  2. awk '{
  3. print "Line no:"NR",No of fields:"NF, "$0="$0,"$1="$1,"$2="$2,"$3="$3
  4. }'

小注一下:$1是打印第一个,$NF打印最后一个字段,$(NF-1)打印倒数第二个

例2.

  1. seq 5 | awk 'BEGIN{ sum=0;print "Summation:"}{print $1"+";sum+=1}END{print "==";print sum}'

这个例子用到了基本格式。

BEGIN中 初始化了sum,打印Summation

中间模块打印了第一列,然后给sum+1

END中打印了sum

例3. 关于-v 外部变量

  1. $ VAR=10000
  2. $echo | awk –v VARIABLE=$VAR'{print VARABLE}'

还有另一种灵活的方法可以将多个外部变量传递给awk,例如:

  1. $var1="value1" var2="value2"
  2. $echo | awk '{print v1,v2}' v1=$var1 v2=$var2

如果来自文件

  1. awk '{print v1,v2}' v1=$var1 v2=$var2 filename

例4

$awk 'NR < 5' #行号小于5

$awk 'NR==1,NR==4' #行号在1到5之间的行

$awk '/linux/' #包含样式linux的行(可以用正则表达式指定样式)

$awk '!/linux/' #不包含样式linux的行

AWK用法整理的更多相关文章

  1. grep,sed,awk用法整理

    grep -c 打印出符合要求的行数 -i 忽略大小写              ignore -n 连同符号一起输出          num -v 打印出不符合要求的行 -A2 本行及下面两行 - ...

  2. 收集整理的awk用法小结

    awk 用法:awk ‘ pattern {action} ‘ 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS 输 ...

  3. CU社区shell板块awk十三问整理

    CU社区shell板块awk十三问整理 一.RS="" 当 RS="" 时,会将\n强制加入到FS变量中,因为RS为空时,是将连续多空行作为分隔符,近似于\n\ ...

  4. linux学习:特殊符号,数学运算,图像与数组与部分终端命令用法整理

    指令:let.expr.array.convert.tput.date.read.md5.ln.apt.系统信息 一:特殊符号用法整理 系统变量 $# 是传给脚本的参数个数 $0 是脚本本身的名字 $ ...

  5. awk 用法(使用入门)

    转自:http://www.cnblogs.com/emanlee/p/3327576.html awk 用法:awk ' pattern {action} '  变量名    含义 ARGC   命 ...

  6. awk用法小结(作者总结)

    http://www.chinaunix.net/old_jh/24/691456.html http://wenku.baidu.com/view/ebac4fc658f5f61fb736664d. ...

  7. Spring JdbcTemplate用法整理

    Spring JdbcTemplate用法整理: xml: <?xml version="1.0" encoding="UTF-8"?> <b ...

  8. sed和awk用法

    sed和awk用法 Sed sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为 ...

  9. linq用法整理

    linq用法整理 普通查询 var highScores = from student in students where student.ExamScores[exam] > score se ...

随机推荐

  1. js学习笔记1---使用方法

    1.获取对象: a) 通过名称来获取元素:document.getElementById() //属于静态方法,方法前面只能用document b) document.getElementsByCla ...

  2. XML中 添加或修改时 xmlns&equals;&quot&semi;&quot&semi; 怎么删除

    //创建节点时 记得加上  ---> xmldoc.DocumentElement.NamespaceURI XmlElement url = xmldoc.CreateElement(&quo ...

  3. 用lisp来让计算机学会写作

    大部分的代码.思路参考了<Ansi Common Lisp>P138~P141. 问题:给一篇英文文本,如何让计算机依据此文本而生成随机但可读的文本.如: |Venture| The Na ...

  4. 数据传输对象&lpar;DTO&rpar;介绍及各类型实体比较

    数据传输对象(DTO)介绍及各类型实体比较 本文将介绍DDD分层架构中广泛使用的数据传输对象Dto,并且与领域实体Entity,查询实体QueryObject,视图实体ViewModel等几种实体进行 ...

  5. python 程序中调用go

    虽然python优点很多,但是有一个致命的缺点就是运行速度太慢,那么python程序需要一些计算量比较大的模块时一般会调用c或者c++的代码来重写,但是c/c++编写代码代价太高,耗费太多的人力.那么 ...

  6. idea编辑器激活码

    激活方式:License Server1.将地址 http://active.chinapyg.com/ 或者 http://idea.toocruel.net 任意一个复制到License Serv ...

  7. ios uibutton加数字角标

    http://www.jianshu.com/p/0c7fae1cadac 第一种:https://github.com/mikeMTOL/UIBarButtonItem-Badge第二种:https ...

  8. 异常 try – finally 注意的地方

    finally 异常机制中还有一个重要的部分,就是finally, catch后面可以跟finally语句,语法如下所示:   try{ //可能抛出异常 }catch(Exception e){ / ...

  9. 洛谷 P3225 &lbrack;HNOI2012&rsqb;矿场搭建 解题报告

    P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...

  10. Java如何检查文件是否在服务器上被修改了?

    在Java编程中,如何检查文件是否在服务器上被修改了? 以下示例显示如何检查文件是否在服务器上进行了修改. package com.yiibai; import java.net.URL; impor ...