iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >awk使用示例分析
  • 584
分享到

awk使用示例分析

2023-06-04 08:06:35 584人浏览 安东尼
摘要

这篇文章主要讲解了“awk使用示例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“awk使用示例分析”吧!awk是一个强大的文本分析工具。awk其名称得自于它的创始人 Alfred Aho

这篇文章主要讲解了“awk使用示例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“awk使用示例分析”吧!

awk是一个强大的文本分析工具。

awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 awk 的确拥有自己的语言: awk 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

  • -F 指定分隔符,而不以默认的空白(空格符或者制表符)

  • -v 指定变量

  • -f 指定脚本的文件名,即将脚本放入一个文件当中,避免 awk 书写太长,影响视觉,和重复编写

  • BEGIN 关键字会执行一次指定的脚本段

  • END 关键字定义的脚本段,在所有操作完成之后

处理数据的脚本段在第二个程序中定义

  • ++ -- 增加与减少(前置或后置)

  • ^ ** 指数(右结合性)

  • ! + - 非、一元加号、一元减号

  • * / % 乘、除、余数

  • + - 加、减

  • < <= == != > >= 比较

  • && 逻辑AND( 简写)

  • || 逻辑OR( 简写)

  • ?: 三元条件式

  • = += -= *= /= %= ^= **= 赋值( 右结合性)

  • $ 后面跟数字,表示获取指定列的域,0 代表取整条记录

  • ARGC 命令行参数个数

  • ARGV 命令行参数构成胡数组

  • FILENAME 当前输入文件的文件名

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

  • OFS 输出域分隔符

  • RS 控制记录分隔符

  • ORS 输出记录分隔符

  • NF 浏览记录的域的个数

  • NR 已读的记录数

  • FNR 与NR功用类似,不同的是awk每打开一个新文件,FNR便从0重新累计

  • IGNORECASE 是否忽略大小写

记录 默认指的是每行,因为记录分隔符(RS)是换行符
域 默认指的是每个单词,因为域分隔符(FS)是空格

awk 通过内建变量 ARGC ( 参数计数 ) 与 ARGV ( 参数向量,或参数值 ) ,让命令行参数可用。

cat showargs.awk   BEGIN {     print "ARGC= ", for 0; k<ARGC; k++)

{         print "ARGV["k"]=["ARGV[k]"]"         } }   awk -f showargs.awk mi_info # ARGC=  2# ARGV[0]=[awk] # ARGV[1]=[mi_info] ## 求和 awk '{sum+=$NF} END {print "Sum = ", sum}' mi_info # Sum =  21693

## 求平均 awk '{sum+=$NF} END {print "Average = ", sum/NR}' mi_info # Average =  3099

## 求最大值 awk 'BEGIN {max = 0} {if ($NF>max) max=$NF fi} END {print "Max=", max}' mi_info  # Max= 3999

## 求最小值(min的初始值设置一个超大数即可) awk 'BEGIN {min = 1999999} {if ($NF<min) min=$NF fi} END {print "Min=", min}' mi_info # Min= 2499

# 求访问次数的Top 10 Resource,可以根据此进行优化 cat logs/`date +%u`.log | grep -v '172.16' |grep -v '127.0.0.1' \     | awk '{ if(index($1,"219.141.246")!=0) print $2; else print $1 }' \     | sort | uniq -c | sort -n | tail -n 10

# awk的范围模式也是封闭范围。 # 在所有记录中他们会顺序进行多次匹配,第一次匹配完后还可以进行下面接下来的第二次、第三次可能的匹配范围。 # 如果开头匹配到了,但是没有结尾的话,会把整个文件记录的末尾当作是这次匹配的结尾作为范围 awk '/mi6/,/note/ {print NR, $1, $NF}' mi_info  # 1 mi6-1 2499
# 2 mi6-2 2899
# 3 minote3-1 2499
# 忽略大小写 awk '{IGNORECASE=1}; $1~"MI" {print NR,$0}' mi_info # "所有信息"
# 每 5 行合并为 1 行 BEGIN {     a = 0;     s = ""; } {     a += 1;     s = s" | "$0     if (a % 5 == 0) {         print s;         s = "";     } } END {     print s }   awk 'BEGIN{a="100"; b="10test10"; print (a+b+0);}'
# 110
# 只需要将变量通过 "+" 连接运算。自动强制将字符串转为整型。 # 非数字变成 0,发现第一个非数字字符,后面自动忽略。   awk 'BEGIN{a=100;b=100;c=(a""b);print c}'
# 100100
# 只需要将变量与 "" 符号连接起来运算即可。   awk 'BEGIN{a="a";b="b";c=(a+b);print c}'
# 0
# 字符串连接操作通"二","+"号操作符。模式强制将左右2边的值转为 数字类型。然后进行操作。

数组

## 数组示例 awk 'BEGIN{x=0;i=0;} \     {name[x++]=$1;} \     END { for(;i<NR;i++){ print "name["i"] is",name[i]} }' mi_info   # name[0] is mi6-1
# name[1] is mi6-2
# name[2] is minote3-1
# name[3] is minote3-2
# name[4] is mix2-1
# name[5] is mix2-2
# name[6] is mix2-3

正则表达式元字符

  • ^ 行首定位符

  • $ 行尾定位符

  • . 匹配除换行之外的单个字符

  • \* 匹配0个或者多个前导字符(这里是前导字符0或者多个,任意一个或多个字符,使用 .* )

  • + 匹配一个或者多个前导字符

  • ? 匹配0个或者1个前导字符

  • [] 指定字符中的任意一个字符,比如[Ll] [a-z]

  • [^] 上面一样,不匹配的字符

  • AA|BB 匹配AA或者BB

  • (AB)+ 匹配一个或者多个AB组合,比如AB,ABAB,ABABAB...

  • \* 匹配*本身

  • & 保存查找匹配到的串,可以用在后面的替换中 s/love

内置函数

  • sub(/reg/,替换串[,目标串])

  • gsub(/reg/,替换串[,目标串])

  • index(str,sub_str) 返回sub_str第一次在str中出现的位置(偏移量从1开始)

  • length(str) 返回字符串的字符个数

  • substr(str,start_pos[,length]) 返回子串,如果没有length,就到串的末尾

  • match(str,/reg/) 返回正则匹配在字符串中的位置,同时设置RSTART和RLENGTH的值

  • split(str,arr_name[,split_sig])

  • atan2(x,y)

  • cos(x)

  • exp(x)

  • log(x)

  • sin(x)

  • sqrt(x)

  • int(x)直接舍去小数,保留整数部分

  • rand() 产生随机数(0~1) srand(x) 初始化随机数种子

默认情况下每次调用rand(),结果都会产生相同的随机数,这时候需要调用srand()重新产生一个种子,后面的随机数才不同

## 函数示例 awk 'BEGIN{ print rand(),rand(),srand(),rand(),rand();}'
# 0.237788 0.291066 1 0.215969 0.629868
awk 'BEGIN{ print rand(),rand(),srand(),rand(),rand();}'
# 0.237788 0.291066 1 0.556348 0.749557
awk 'BEGIN{ print rand(),rand(),srand(),rand(),rand();}'
# 0.237788 0.291066 1 0.0931369 0.835396

条件语句和循环

## 语句和循环示例   (a) if
# 在条件模式中,if是隐含的模式了,而条件语句if也可以按照需要直接声明出来的句式类似于
if () {} else if else {}   awk '{ if( $1 ~ /note/) { print "note related."} else if ( $1 ~ /mix/ ) { print "mix related."} else { print "other ..."} }' mi_info # other ... # other ... # note related. # note related. # mix related. # mix related. # mix related.   (b) while
# 句法
while () {}   awk 'BEGIN { i = 0; count = 0; } { while ( i < NR ) { i ++; if ( $1 ~ /note/ ) { count++; print NR, $1,$4,$5 } } } END { print "Count:",count }' mi_info # 3 minote3-1 6G 64G # 4 minote3-2 6G 128G # Count: 2

(c) for
# 普通for循环,句法
for( ; ; ){}   awk 'BEGIN { i = 0;} { for(;i<NR;i++) { if( $1 ~ /note/ ){ print NR,$1,$4,$5,"~~" } }}' mi_info # 3 minote3-1 6G 64G ~~ # 4 minote3-2 6G 128G ~~   (d) break continue
# 同C/C++语言一样,是作用于跳出循环体和跳出本次循环的关键字。   ### 程序控制语句 (a) next # 从文件中读取下一行输入,然后从awk脚本顶部开始重新执行。同continue效果也有点相似,只不过这里是作用于awk工具在对每行操作的自动“循环”中的
(b) exit # 中断记录的处理,但是不能够跳过END语句块。exit可以带一个范围为0~255的退出参数,约定0表示成功,这个退出参数实际就传递给了$?表示执行的结果   awk '{ if ( $1 ~ /note/ ) { print NR,$1,$7,"skip"; next; } if ( $1 ~ /mix/ ) { print NR,$1,$7,"exit will"; exit 3; } print NR,$1,$7,"after if..."; } END { print "Fininal should be called here..." }' mi_info # 1 mi6-1 2499 after if... # 2 mi6-2 2899 after if... # 3 minote3-1 2499 skip # 4 minote3-2 2899 skip # 5 mix2-1 3299 exit will # Fininal should be called here... echo $? # 3

系统交互

## (a) 支持 > >> 重定向符号使用的时候作为文件名参数需要使用 "" 括起来,getline可以用于输入重定向来获得输入信息awk 'BEGIN { "date" | getline date; print "The date is",date > "date.file"}'cat date.file# The date is Wed Dec 28 18:43:39 HKT 2016## (b) 管道 |awk '/note/ { print $0 | "grep 2499" }' mi_info# minote3-1 5.5" 660 6G 64G 3500mAh 2499## (c) system 函数。可以进行系统命令调用awk 'BEGIN { system("whoami") }'# root## (d) printf 格式化输出信息,跟C语言的类似awk 'BEGIN { printf "Hello, %s, you are %d years old.\n","Nicol TAO","23"}'# Hello, Nicol TAO, you are 23 years old.
  • 如果处理逻辑复杂,就将代码写进文件里,再通过 -f 引用;这样可防止敲错代码。

  • 灵活调用系统命令,内置变量,使代码更简洁。

  • 处理大文件时,多审核优化逻辑代码,可有效提高执行效率。

感谢各位的阅读,以上就是“awk使用示例分析”的内容了,经过本文的学习后,相信大家对awk使用示例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: awk使用示例分析

本文链接: https://www.lsjlt.com/news/237099.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • awk使用示例分析
    这篇文章主要讲解了“awk使用示例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“awk使用示例分析”吧!awk是一个强大的文本分析工具。awk其名称得自于它的创始人 Alfred Aho...
    99+
    2023-06-04
  • awk使用实例分析
    本篇内容主要讲解“awk使用实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“awk使用实例分析”吧!awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析...
    99+
    2023-06-27
  • awk多行合并的示例分析
    今天就跟大家聊聊有关awk多行合并的示例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。awknext语句使用:在循环逐行匹配,如果遇到next,就会跳过当前行,直接忽略下面语句。...
    99+
    2023-06-13
  • linux中awk高级应用的示例分析
    这篇文章主要为大家展示了“linux中awk高级应用的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“linux中awk高级应用的示例分析”这篇文章吧。处理前的文档: Mike ...
    99+
    2023-06-09
  • Node.js使用示例分析
    本篇内容介绍了“Node.js使用示例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Node.js 的非阻塞 I/OI/O 即 ...
    99+
    2023-06-17
  • Awk条件语句和循环语句的示例分析
    这篇文章给大家分享的是有关Awk条件语句和循环语句的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Awk是Unix环境下一种非常好的语言,适合于文本处理和报表生成,它还有许多精心设计的特性,允许进行特殊技...
    99+
    2023-06-27
  • 使用Ajax的示例分析
    这篇文章主要为大家展示了“使用Ajax的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“使用Ajax的示例分析”这篇文章吧。什么是ajaxajax(异步j...
    99+
    2024-04-02
  • 使用VanillaJS的示例分析
    这篇文章给大家分享的是有关使用VanillaJS的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。时间注意原始操作符比函数调用快,使用VanillaJS比如,一般不要这样:...
    99+
    2024-04-02
  • 使用Vue的示例分析
    这篇文章将为大家详细讲解有关使用Vue的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Vue的优点Vue具体轻量级框架、简单易学、双向数据绑定、组件化、数据和结构的分离、虚拟DOM、运行速度快等优...
    99+
    2023-06-15
  • 使用MySQL的示例分析
    这篇文章主要介绍了使用MySQL的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。属性表(product_props)结构如下数据量8...
    99+
    2024-04-02
  • C++BoostAny示例分析使用
    目录一、提要二、Boost.Any示例一、提要 强类型语言,例如 C++,要求每个变量都有一个特定的类型来定义它可以存储什么样的信息。其他语言,例如 JavaScript,允许开发人...
    99+
    2022-11-13
    C++ Boost Any C++ Boost Any示例
  • rsync使用的示例分析
    这篇文章给大家介绍rsync使用的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。要想同步某一位置文件和目录到另一个位置去可以使用Rsync,备份的位置可以在本地服务器或远程服务器。rsync特征速度:第一次的r...
    99+
    2023-06-28
  • 使用svg的示例分析
    这篇文章主要为大家展示了“使用svg的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“使用svg的示例分析”这篇文章吧。1、例子一css代码html,&n...
    99+
    2024-04-02
  • Linux支付命令操作之grep、sed、awk的示例分析
    这篇文章将为大家详细讲解有关Linux支付命令操作之grep、sed、awk的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、grepgrep命令主要用于文本内容的查找。它支持正则表达式查找,命...
    99+
    2023-06-05
  • Ajvformat校验使用示例分析
    目录初始化项目demo运行分解新建index.js文件分析总结初始化项目demo npm init -y 安装 Ajv 版本 7 npm install ajv 安装ajv-...
    99+
    2022-11-13
    Ajv format校验 Ajv format
  • Vueextend使用示例深入分析
    目录一、使用场景二、补充组件注册三、深度解析Vue.extend()虽然已近用过很多次了,但都没有深入思考过这个东西,仔细想了想,有点意思 一、使用场景 按需使用组件,也叫懒加载,性...
    99+
    2024-04-02
  • 使用v-model的示例分析
    小编给大家分享一下使用v-model的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Vue v-model是一个指令,它提供了input和form之间或两...
    99+
    2023-06-14
  • springboot使用nacos的示例分析
    springboot使用nacos的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。pom.xml:<xml version="1.0"...
    99+
    2023-06-22
  • Linux sed使用的示例分析
    这篇文章将为大家详细讲解有关Linux sed使用的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。sed 一种流向编辑器 stream editor,是Linux中三大文件处理工具(...
    99+
    2023-06-28
  • Awk的BEGIN和END模式实例分析
    本篇内容介绍了“Awk的BEGIN和END模式实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!awk是Unix环境下一种非常好的语言,...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作