awk:处理复杂文本格式

2024-03-17 14:59
文章标签 处理 awk 复杂 文本格式

本文主要是介绍awk:处理复杂文本格式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

awk特点

       awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

1. awk是一种编程语言,用于对文本和数据进行处理的

2. 具有强大的文本格式化能力

3. 利用命令awk,可以将一些文本整理成为我们想要的样子

4. 命令awk是逐行进行处理的

一般日志过滤处理主要有以下几种方式:

    1.查找关键日志grep
    2.精简日志内容 sed
    3.对记录进行排序sort
    4.统计日志相关记录数 awk

awk命令

awk [options] 'pattern{action}' file

完整格式:

awk [-F|-f|-v] BEGIN{ commands }  pattern{ commands }  END{ commands } file

  •  [-F|-f|-v]   大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value

一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。

  • 第一步:执行BEGIN{ commands }语句块中的语句; 
  • 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部     被读取完毕。
  • 第三步:当读至输入流末尾时,执行END{ commands }语句块。

     BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。 

    END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。 

    pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

awk变量:

  • $0           表示整个当前行
  • $1           每行第一个字段
  • NF          字段数量变量
  • NR          每行的记录号,多文件记录递增
  • FNR        与NR类似,不过多文件记录不递增,每个文件都从1开始
  • \t            制表符
  • \n           换行符
  • FS          BEGIN时定义分隔符
  • RS       输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
  • ~            匹配,与==相比不是精确比较
  • !~           不匹配,不精确比较
  • ==         等于,必须全部相等,精确比较
  • !=           不等于,精确比较
  • &&      逻辑与
  • ||             逻辑或
  • +            匹配时表示1个或1个以上
  • /[0-9][0-9]+/   两个或两个以上数字
  • /[0-9][0-9]*/    一个或一个以上数字
  • FILENAME 文件名
  • OFS      输出字段分隔符, 默认也是空格,可以改为制表符等
  • ORS        输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
  • -F'[:#/]'   定义三个分隔符   

 

awk中的pattern模式

  当awk进行逐行处理时,会把pattern作为条件,判断当前行是否满足条件,若跟pattern匹配,则进行后面的处理,否则,跳过当前行。

  

  1. 正则表达式

    awk下的正则表达式与grep下的区别:

    1)awk下:   awk '/正则表达式/{print}' /etc/passwd

    2)grep下:  grep "正则表达式" /etc/passwd

    

    需要注意的是 

      1)在awk的正则表达式中,若出现"/",则需要进行转义,在其前面加"\"

      2)当使用{x,y}类型次数匹配的正则表达式时,需要使用--posix选项或--re-interval选项

  2. 行范围匹配

    awk '/正则表达式1/,/正则表达式2/{action}' file

    表示的是,从被正则表达式1匹配到的行开始,到被正则表达式2匹配到的行结束,之间所有的行都会执行对应的动作。

 

 关系运算符

关系运算符含义用法实例
<小于x<y
<=小于等于x<=y
>大于x>y
>=大于等于x>=y
==等于x==y
!=不等于x!=y
~匹配x~/正则表达式/
!~不匹配x!~/正则表达式/

awk高级用法

1.awk赋值运算


赋值语句运算符:= += -= *= /= %= ^= **=

例如:a+=5;等价于a=a+5

[root@localhost ~]# awk 'BEGIN{a=5;a+=5;print a}'
10

2.awk正则运算


输出包含有root的行,并打印用户名和UID及原行内容

[root@localhost ~]# awk -F: '/root/ {print $1,$3,$0}' /etc/passwd
root 0 root:x:0:0:root:/root:/bin/bash
operator 11 operator:x:11:0:operator:/root:/sbin/nologin

我们发现找到了两行,如果我们想找root开头的行就要这样写:awk -F: '/^root/' /etc/passwd

3.awk三目运算

[root@localhost ~]# awk 'BEGIN{a="b";print a=="b"?"ok":"err"}'
ok
[root@localhost ~]# awk 'BEGIN{a="b";print a=="c"?"ok":"err"}'
err

三目运算其实就是一个判断运算,如果为真则输出?后的内容,如果为假则输出:后的内容


4.awk的循环运用


if语句运用

[root@localhost ~]# awk 'BEGIN{ test=100;if(test>90){ print "very good";} else{print "no pass";}}'
verygood

每条命令后用;结尾
while循环运用
计算从1累加到100的值

[root@localhost ~]# awk 'BEGIN{test=100;num=0;while(i<=test){num+=i; i++;}print num;}'
5050

for循环的运用

[root@localhost ~]# awk 'BEGIN{test=0;for(i=0;i<=100;i++){test+=i;}print test;}'
5050


do循环的运用

[root@localhost ~]# awk 'BEGIN{test=0;i=0;do{test+=i;i++}while(i<=100)print test;}'
5050

5.awk的数组运用


 数组是awk的灵魂,处理文本中最不能少的就是它的数组处理。

因为数组索引(下标)可以是数字和字符串在awk中数组叫做关联数组(associative arrays)。

awk 中的数组不必提前声明,也不必声明大小。

数组元素用0或空字符串来初始化,这根据上下文而定。

一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。


显示/etc/passwd的账户

awk -F: 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
0 root
1 bin
2 daemon
3 adm
4 lp
5 sync
........................................................................

6.awk字符串函数的运用


函数名 描述
sub 匹配记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配的 时候

sub (regular expression, substitution string):
sub (regular expression, substitution string, target string)

实例:

awk '{ sub(/test/, "mytest"); print }' testfile
awk '{ sub(/test/, "mytest"); $1}; print }' testfile

第一个例子在整个记录中匹配,替换只发生在第一次匹配发生的时候。如要在整个文件中进行匹配需要用到gsub

第二个例子在整个记录的第一个域中进行匹配,替换只发生在第一次匹配发生的时候。


gsub 整个文档中进行匹配
gsub (regular expression, substitution string)
gsub (regular expression, substitution string, target string)

实例:

awk '{ gsub(/test/, "mytest"); print }' testfile
awk '{ gsub(/test/, "mytest" , $1) }; print }' testfile

第一个例子在整个文档中匹配test,匹配的都被替换成mytest。

第二个例子在整个文档的第一个域中匹配,所有匹配的都被替换成mytest。
index 返回子字符串第一次被匹配的位置,偏移量从位置1开始
index(string, substring)

实例:

 awk '{ print index("test", "mytest") }' testfile

实例返回test在mytest的位置,结果应该是3。
substr 返回从位置1开始的子字符串,如果指定长度超过实际长度,就返回整个字符串
substr( string, starting position )
substr( string, starting position, length of string )

实例:

         awk '{ print substr( "hello world", 7,11 ) }' 

上例截取了world子字符串。
split 可按给定的分隔符把字符串分割为一个数组。如果分隔符没提供,则按当前FS值进行分割
split( string, array, field separator )
split( string, array )

实例:

         awk '{ split( "20:18:00", time, ":" ); print time[2] }'

上例把时间按冒号分割到time数组内,并显示第二个数组元素18。
length 返回记录的字符数
length( string )
length

实例:

         awk '{ print length( "test" ) }' awk '{ print length }' testfile

第一个实例返回test字符串的长度。

第二个实例返回testfile文件中第条记录的字符数。
match 返回在字符串中正则表达式位置的索引,如果找不到指定的正则表达式则返回0。match函数会设置内建变量RSTART为字符串中子字符串的开始位 置,RLENGTH为到子字符串末尾的字符个数。substr可利于这些变量来截取字符串
match( string, regular expression )

实例:

         awk '{start=match("this is a test",/[a-z]+$/); print start}'awk '{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }'

第一个实例打印以连续小写字符结尾的开始位置,这里是11。

第二个实例还打印RSTART和RLENGTH变量,这里是11(start),11(RSTART),4(RLENGTH)。
toupper和tolower 可用于字符串大小间的转换,该功能只在gawk中有效
toupper( string )
tolower( string )

实例:

         awk '{ print toupper("test"), tolower("TEST") }'

 

参考链接:http://blog.51cto.com/13438667/2096206

这篇关于awk:处理复杂文本格式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/819279

相关文章

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

SpringSecurity中的跨域问题处理方案

《SpringSecurity中的跨域问题处理方案》本文介绍了跨域资源共享(CORS)技术在JavaEE开发中的应用,详细讲解了CORS的工作原理,包括简单请求和非简单请求的处理方式,本文结合实例代码... 目录1.什么是CORS2.简单请求3.非简单请求4.Spring跨域解决方案4.1.@CrossOr

requests处理token鉴权接口和jsonpath使用方式

《requests处理token鉴权接口和jsonpath使用方式》文章介绍了如何使用requests库进行token鉴权接口的处理,包括登录提取token并保存,还详述了如何使用jsonpath表达... 目录requests处理token鉴权接口和jsonpath使用json数据提取工具总结reques

C# 空值处理运算符??、?. 及其它常用符号

《C#空值处理运算符??、?.及其它常用符号》本文主要介绍了C#空值处理运算符??、?.及其它常用符号,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、核心运算符:直接解决空值问题1.??空合并运算符2.?.空条件运算符二、辅助运算符:扩展空值处理

浅析Python中如何处理Socket超时

《浅析Python中如何处理Socket超时》在网络编程中,Socket是实现网络通信的基础,本文将深入探讨Python中如何处理Socket超时,并提供完整的代码示例和最佳实践,希望对大家有所帮助... 目录开篇引言核心要点逐一深入讲解每个要点1. 设置Socket超时2. 处理超时异常3. 使用sele

SpringMVC配置、映射与参数处理​入门案例详解

《SpringMVC配置、映射与参数处理​入门案例详解》文章介绍了SpringMVC框架的基本概念和使用方法,包括如何配置和编写Controller、设置请求映射规则、使用RestFul风格、获取请求... 目录1.SpringMVC概述2.入门案例①导入相关依赖②配置web.XML③配置SpringMVC

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺