awk命令

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。

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

代码块

awk的所有代码(目前这么认为)都是写在语句块中的。

语句块可分为3类:

BEGIN语句块、END语句块和main语句块。

其中BEGIN语句块和END语句块都是的格式分别为BEGIN{...}和END{...},而main语句块是一种统称,它的pattern部分没有固定格式,也可以省略,main代码块是在读取文件的每一行的时候都执行的代码块。

BEGIN代码块:

在读取文件之前执行,且执行一次
在BEGIN代码块中,无法使用$0或其它一些特殊变量
main代码块:

读取文件时循环执行,(默认情况)每读取一行,就执行一次main代码块
main代码块可有多个
END代码块:

在读取文件完成之后执行,且执行一次
有END代码块,必有要读取的数据(可以是标准输入)
END代码块中可以使用$0等一些特殊变量,只不过这些特殊变量保存的是最后一轮awk循环的数据

语法

awk [options] 'pattern{action}'   file1 fiel1

awk的语法:

多个pattern{action}可以直接连接连用
action中多个语句如果写在同一行,则需使用分号分隔
pattern部分用于筛选行,action表示在筛选通过后执行的操作
pattern和action都可以省略
省略pattern,等价于对每一行数据都执行action
例如:awk '{print $0}' a.txt
省略代码块{action},等价于{print}即输出所有行
例如:awk '/Alice/' a.txt等价于awk '/Alice/{print $0}' a.txt
省略代码块中的action,表示对筛选的行什么都不做
例如:awk '/Alice/{}' a.txt
pattern{action}任何一部分都可以省略
例如:awk '' a.txt

pattern{action}语句结构(都称之为语句块),其中的pattern部分可以使用下面列出的模式:

# 特殊pattern
BEGIN
END

# 布尔代码块
/regular expression/    # 正则匹配成功与否 /a.*ef/{action}
relational expression   # 即等值比较、大小比较 3>2{action}
pattern && pattern      # 逻辑与 3>2 && 3>1 {action}
pattern || pattern      # 逻辑或 3>2 || 3<1 {action}
! pattern               # 逻辑取反 !/a.*ef/{action}
(pattern)               # 改变优先级
pattern ? pattern : pattern  # 三目运算符决定的布尔值

# 范围pattern,非布尔代码块
pattern1, pattern2      # 范围,pat1打开、pat2关闭,即flip,flop模式

工作原理

# awk-F: {print $1,$3}' /etc/passwd

(1)awk使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一一个记录,以换行符结束

(2)然后,行被: (默认为空格或制表符)分解成字段(或域),每个字段存储在已编号的变量中,从$1开始,最多达100个字段

(3)awk如何知道用空格来分隔字段的呢?因为有一个内部变量FS来确定字段分隔符。初始时,FS赋为空格

(4)awk打印字段时,将以设置的方法使用print西数打印,awk在打印的字段间加上空格,因为$1,$3之间有一个逗号。逗号比较特殊,它映射为另一个内部变量,称为输出字段分隔符OFS, OFS默认为空格

(5)awk输出之后,将从文件中获取另行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕

变量RS

可设置表示输入记录分隔符的预定义(Record Separator)来改变每次读取的记录模式。

RS通常设置在BEGIN代码块中,因为要先于读取文件就确定好RS分隔符。

RS指定输入记录分隔符时,所读取的记录中是不包含分隔符字符的。例如RS="a",则$0中一定不可能出现字符a

特殊的RS值用来解决特殊读取需求:

RS="":按段落读取
RS="\0":一次性读取所有数据,但有些特殊文件中包含了空字符\0
RS="^$":真正的一次性读取所有数据,因为非空文件不可能匹配成功
RS="\n+":按行读取,但忽略所有空行

RS两种可能情况:
·RS为单个字符:直接使用该字符来分割记录
·RS为多个字符:将其当做正则表达式,只要匹配正则表达式的符号,都用来分割记录
。设置预定义变量IGNORECASE为非索,正匹配时表示忽略大小写
。兼容模式下,只有首字符才生效,不会使用正则模式去分割记录

RT

在读取每条记录之后,将其赋值给$0,同时还会设置NR、FNR、RT。

在awk每次读完一条记录时,会设置一个称为RT的预定义变量,表示Record Termination。

当RS为单个字符时,RT的值和RS的值是相同的。

当RS为多个字符(正则表达式)时,则RT设置为正则匹配到记录分隔符之后,真正用于划分记录时的字符。

当无法匹配到记录分隔符时,RT设置为控制空字符串(即默认的初始值)。

NR

在读取每条记录之后,将其赋值给$0,同时还会设置NR、FNR、RT。

所有文件的行号计数器

FNR

在读取每条记录之后,将其赋值给$0,同时还会设置NR、FNR、RT。

是各个文件的行号计数器

字段分割

awk读取每一条记录之后,会将其赋值给$0,同时还会对这条记录按照预定义变量FS划分字段,将划分好的各个字段分别赋值给$1 $2 $3 $4...$N,同时将划分的字段数量赋值给预定义变量NF

$N引用字段:

N=0:即$0,引用记录本身
0<N<=NF:引用对应字段
N>NF:表示引用不存在的字段,返回空字符串
N<0:报错

方式:

读取record之后,将使用预定义变量FS、FIELDWIDTHS或FPAT中的一种来分割字段。分割完成之后,再进入main代码段(所以,在main中设置FS对本次已经读取的record是没有影响的,但会影响下次读取)。

FS或-F

FS或者-F:字段分隔符

FS为单个字符时,该字符即为字段分隔符
FS为多个字符时,则采用正则表达式模式作为字段分隔符
特殊的,也是FS默认的情况,FS为单个空格时,将以连续的空白(空格、制表符、换行符)作为字段分隔符
特殊的,FS为空字符串””时,将对每个字符都进行分隔,即每个字符都作为一个字段
设置预定义变量IGNORECASE为非零值,正则匹配时表示忽略大小写(只影响正则,所以FS为单字时无影响)
如果record中无法找到FS指定的分隔符(例如将FS设置为”\n”),则整个记录作为一个字段,即$1和$0相等。

FIELDWIDTHS

指定预定义变量FIELDWIDTHS按字符宽度分割字段,这是gawk提供的高级功能。在处理某字段缺失时非常好用。

·FIELDWIDTHS="3569"表示第一个字段3字符,第二字段5字符.…
·FIELDWIDTHS="81:562:33"表示:
。第一个字段读8个字符
。然后跳过1个字符再读5个字符作为第二个字段
。然后读6个字符作为第三个字段
。然后跳过2公字符在读33个字符作为第四个字段(如果不足33个字符,师读到结尾)
·FIELDWIDTHS="23*":
。第一个字段2个字符。第二个字段3个字符
。第三个字段剩余所有字符
。星号只能放在最后,且只能单独使用,表示剩余所有

FPAT

FS是指定字段分隔符,来取得除分隔符外的部分作为字段。

FPAT是取得匹配的字符部分作为字段。它是gawk提供的一个高级功能。

FPAT根据指定的正则来全局匹配record,然后将所有匹配成功的部分组成$1、$2...,不会修改$0。

awk 'BEGIN{FPAT="[0-9]+"}{print $3"-"}' a.txt
之后再设置FS或FPAT,该变量将失效

OFS

分割表示使用FS(field Separator),计算表示使用预定义变量OFS(Output Field Separator)。

修改$0,将使用FS重新分割字段,所以会影响$1、$2...
修改$1、$2,将根据$1到$NF等各字段来重新计算$0
即使是$1 = $1这样的原值不变的修改,也一样会重新计算$0
为不存在的字段赋值,将新增字段并按需使用空字符串填充中间的字段,并使用OFS重新计算$0
awk 'BEGIN{OFS="-"}{$(NF+2)=5;print $0}' a.txt
增加NF值,将使用空字符串新增字段,并使用OFS重新计算$0
awk 'BEGIN{OFS="-"}{NF+=3;print $0}' a.txt
减小NF值,将丢弃一定数量的尾部字段,并使用OFS重新计算$0
awk 'BEGIN{OFS="-"}{NF-=3;print $0}' a.txt

没有导致$0重建,$0就一直是原原本本的数据,所以指定OFS也无效。

当$0重建后,将自动使用OFS重建,所以即使没有指定OFS,它也会采用默认值(空格)进行重建。

如果重建$0之后,再去修改OFS,将对当前行无效,但对之后的行有效。所以如果也要对当前行生效,需要再次重建。

有FS、FIELDWIDTHS、FPAT三种获取字段的方式,可使用PROCINFO数组来确定本次使用何种方式获得字段。

PROCINFO是一个数组,记录了awk进程工作时的状态信息。

如果:

PROCINFO["FS"]=="FS",表示使用FS分割获取字段
PROCINFO["FPAT"]=="FPAT",表示使用FPAT匹配获取字段
PROCINFO["FIELDWIDTHS"]=="FIELDWIDTHS",表示使用FIELDWIDTHS分割获取字段

ARGV  数组,保存命令行本身这个字符串,如awk '(print 50)'  a.txt,这个命令中,ARGV[0]保存awk ARGV[1]保存a.txt:

ARGC  awk命令的参数的个数         FILENAME  awk命令所处理的文件的名称

ENVIRON:当前环境变量及其值的关联数组

自定义变量test :  awk -v test="test" 'begin{print test}'   awk   'begin{ test="test";print test}' 

-----------格式化输出printf

format格式的指示符都以开头,后跟一个字符:

%c:显示字符的ASCII码     %d, %i点十进制整数         %e,%E:科学计数法显示数值            %f:显示浮点数
%g,%G:以科学计数法的格式或浮点数的格式显示数值       %s:显示字符串    %u:无符号整数        %%显示%自身

修饰符
N:显示宽度                 -:  左对齐             +:显示数值符号

awk -F :'{printf "%-15s %i\n",$1,$3}'        /etc/passwd

--------------内置函数

length   返回string字符 キ中字符的个数

awk   -F : ‘{i1,while(i<NF){if(length)}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu安装字符集

sudo locale-gen zh_CN.GBK sudo locale-gen zh_CN

正则表达式和grep

正则表达式(regular expression, RE)是一种字符模式&#xff0c;用于在查找过程中匹配指定的字符。 在大多数程序里&#xff0c;正则表达式都被置于两个正斜杠之间;例如/lv[o0]e/就是由正斜杠界定的正则表达式&#xff0c;它将匹配被查找的行中任何位置出现的相同模式。在正则表…

GC 垃圾回收

垃圾回收机制是由垃圾收集器Garbage Collection GC来实现的&#xff0c;GC是后台的守护进程。它的特别之处是它是一个低优先级进程&#xff0c;但是可以根据内存的使用情况动态的调整他的优先级。因此&#xff0c;它是在内存中低到一定限度时才会自动运行&#xff0c;从而实现对…

如何让你变得魅力十足

我们每个人都希望自己在某些方面对他人来说是有用的。我们渴望那种被人需要的感觉&#xff0c;觉得自己是有能力的&#xff0c;就像我们在某方面很与众不同&#xff0c;很独特一样。 有些人非常有吸引力。他们是那些每当需要帮助便会被想起的人。他们是那些另你觉得非常有帮助…

日志linux

syslog日志系统&#xff1a; syslogd 系统&#xff0c;非内核产生的信息 man 2 syslog klogd 内核&#xff0c;专门负责内核产生的信息 man 3 syslog /var/log/messages 系统标准错误日志信息&#xff0c;非内核 syslogd /var/log/dmesg klogd 共同配置文件etc/…

sysbench的安装和做性能测试

sysbench是一个模块化的、跨平台、多线程基准测试工具&#xff0c;主要用于评估测试各种不同系统参数下的数据库负载情况。关于这个项目的详细介绍请看&#xff1a;http://sysbench.sourceforge.net。它主要包括以下几种方式的测试&#xff1a;1、cpu性能2、磁盘io性能3、调度程…

加密解密

PKI public key Infrastructure 公钥基础设施 CRl 证书吊销列表 CA证书颁发机构 Certificate Authority x509 证书 包括公钥、过期时间、证书的合法拥有者、证书如何被使用 CA的信息 CA的校验码等等 Pki实现方式 TLS/ssl:x509 opengpg ssl安全的套接字层…

高性能MySQL(1)——MYSQL架构

MySQL最重要、最与众不同的特性是它的存储引擎架构&#xff0c;这种架构将查询处理与数据的存储/提取相分离&#xff0c;使得可以在使用时根据不同的需求来选择数据存储的方式。 一、Mysql逻辑架构 如果能在头脑中构建出一幅MySQL各组件之间如何协同工作的架构图&#xff0c;就…

数据库设计中的14个关键技巧

1. 原始单据与实体之间的关系  可以是一对一、一对多、多对多的关系。在一般情况下&#xff0c;它们是一对一的关系&#xff1a;即一张原始单据对应且只对应一个实体。在特殊情况下&#xff0c;它们可能是一对多或多对一的关系&#xff0c;即一张原始单证对应多个实体&#xf…

高性能MySQL(2)——Schema与数据类型的优化

良好的逻辑设计和物理设计是高性能的基石&#xff0c;应该根据系统将要执行的查询语句来设计 schema,这往往需要权衡各种因素。 一、选择优化的数据类型 MySQL支持的数据类型非常多&#xff0c;选择正确的数据类型对于获得高性能至关重要。不管 存储哪种类型的数据&#xff0c…

用户权限sudo、suid、sgid以及facl等

su 切换用户或以指定用户运行命令。 使用su可以指定运行命令的身份(user/group/uid/gid)。 为了向后兼容&#xff0c;su默认不会改变当前目录&#xff0c;且仅设置HOME和SHELL这两个环境变量(若目标用户非root&#xff0c;则还设置USER和LOGNAME环境变量)。推荐使用--login选项…

MySQL 服务器调优

关于 MySQL 调优 有 3 种方法可以加快 MySQL 服务器的运行速度&#xff0c;效率从低到高依次为&#xff1a; 替换有问题的硬件。 对 MySQL 进程的设置进行调优。 对查询进行优化。 替换有问题的硬件通常是我们的第一考虑&#xff0c;主要原因是数据库会占用大量资源。不过这…

通过脚本启动批量服务

/app/all_start_script/wwyt/此目录服务如下&#xff1a;apigateway.sh auth.sh config.sh register.sh zipkin.sh /app/all_start_script/other/此目录服务如下&#xff1a; tomcat.sh wwyt_base.sh wwyt_cache.sh wwyt_flow.sh wwyt_risk_login.sh ww…

高性能MySQL(3)——创建高性能索引

索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时&#xff0c;索引对性能的影响愈发重要。 一、索引的类型 在MySQL中&#xff0c;索引是在存储引擎层而不是服务器层实现的。所以没用统一的索引标准&#xff0c;不同存储引擎的索引工作方式并不相同。 1.1、B-Tre…

linux 调优系列

Linux系统内核:修改TCP/IP调优参数 所有的TCP/IP调优参数都位于/proc/sys/net/目录。例如, 下面是最重要的一些调优参数, 后面是它们的含义: 1. /proc/sys/net/core/rmem_max — 最大的TCP数据接收缓冲。 2. /proc/sys/net/core/wmem_max — 最大的TCP数据发送缓冲。 3.…

java中的构造方法与代码块

一、构造方法 1.1、java中的构造方法跟普通方法有很大的区别&#xff1a; 构造方法的方法名跟类名相同构造方法没有返回值类型,连void也没有,也不能用return返回值每次创建一个对象,都会调用构造方法,如果没有写构造方法,系统会默认加上一个空参的构造,如果已经写了构造方法,…

bash shell是如何识别特殊符号的

一 、 shell命令解析以及识别通配符 Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行 。 实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编…

linux 调优系列(续)

linux 的各大发行版&#xff0c;都有些不必要的服务被默认开启了&#xff0c;针对ubuntu&#xff0c;我们 可以采用选择性关闭的方法加速起动&#xff0c;提高系统性能。 这里我们安装一个软件&#xff1a; sudo apt-get install sysv-rc-conf 然后这样起动&#xff1a; 在这个…

配置文件bashrc与profile的区别

1、当登入系统时候获得-个shell进程时&#xff0c;其读取环境设定档有三步 首先读入的是全局环境变量设定档/ete/profile,然后根据其内容读取额外的设定的文档&#xff0c;如/etc/profile. d和/ etc/ inputre 然后根据不同使用者帐号&#xff0c;去其家目录读取, bash, pr…

高性能MySQL(4)——查询性能优化

査询优化、索引优化、库表结构优化需要齐头并进&#xff0c;一个不落。 一、为什么查询速度为变慢 在尝试编写快速的查询之前,需要清楚一点,真正重要是响应时间。如果把查询看作是一个任务&#xff0c;那么他由一系列子任务组成&#xff0c;每个子任务都会消耗一定的时间。如果…