linux每天一小步---awk命令详解

摘要:
1命令函数awk是Linux环境中功能强大的文本工具。因为awk自然地为文件中的文本提供列处理,如果文件中的每一行由特定的分隔符分隔,我们可以将文件视为由多个列组成的文本。这样的文件最适合用awk处理。实际上,awk主要用于处理工作中的日志文件。

1 命令功能

awk是linux环境下的一个强大的文本工具,由于awk天生提供对文件中文本分列进行处理,所以如果一个文件中的每行都被特定的分隔符(默认为空格)隔开,我们就可以将这个文件看成是有很多列的文本组成,这样的文件最适合用awk进行处理,其实awk在工作中多用于处理log文件。awk在处理庞大文件时不会出现内存溢出或是处理缓慢的问题。

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

2 命令语法

awk 【选项】 '{pattern + action}' 【filename】 #pattern表示awk在文件中要查找的内容,而action指在找到匹配内容时所执行的一系列命令

awk [options] 'BEGIN{ commands } pattern{ command1;commandn } END{ commands }' filename

# options表示awk的可选命令选项,

# BEGIN初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符

# pattern 匹配代码块,可以是字符串或正则表达式

# {}命令代码块,包含一条或多条命令

# ; 多条命令使用分号分隔

#结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息ech

3 命令参数

-F 指定输入文本的分隔符,默认为空格,其分隔符可以是一个字符串也可以是一个正则表达式。-F还可指定多个分隔符,如‘’[ ,]‘’即指定空格和逗号作为分隔符,在指定分隔符时最好加引号。[ ,]+ 表示将空号中在匹配时出现连续的分隔符看成一个,如echo ---1:---2 | awk -F "[-:]+" '{print $2}' 打印出1,echo ---1:---2 | awk -F "[-:]+" '{print $3}' 打印出2.

-v var=value 赋值一个用户定义变量

-f 从脚本文件中读取awk命令

$0 表示整个当前行

$1 表示每行的第一个字段

NF 当前输入记录中的字段数

$NF 表示最后一个列

NR 表示文件行数的记录号,处理多文件时记录数递增

FNR 处理单文件时与NR类似,不过多文件时,每个文件的记录号都从1开始

制表符

换行符

FS BEGIN时定义文本字段分隔符,即列与列之间的分隔符,默认是空格

OFS 输出字段分隔符,默认也是空格

RS 定义输入记录分隔符,即行与行之间的分隔符,默认换行符

ORS 输出记录分隔符,默认为换行符

== 等于,精确比较

!= 不等于

&& 逻辑与

|| 逻辑或

4 使用范例

【1】awk -F: '{print $1 $3}' /etc/passwd #$1与$3内容相连输出,不分隔。

【2】awk -F: '{print $1,$3}' /etc/passwd #$1与$3中间多一个逗号,使之输出内容间以空格分隔

【3】awk -F: '{print "username:" $1 " Uid:" $3}' /etc/passwd #自定义输出

【4】awk '/mysql/{print }' /etc/passwd #从文件中找出匹配字符串的行

【5】awk '!/root/{print $0}' /etc/passwd #从文件中找出不匹配字符创的行

【6】awk -F: '/mail/,/mysql/{print}' /etc/passwd #区间匹配,匹配包含字符串与字符串的行内容

【7】awk -F: '$1~/mail/{print $1}' /etc/passwd #$1与指定内容匹配才显示

【8】awk '/[6][9][7]*/{print $0}' /etc/passwd #匹配包含69为数字开头的行,如69,697,6977等

【9】awk -F: '$1~/mail/ && $3>8 {print }' /etc/passwd #逻辑与,匹配$1匹配mail,并且$3》8的内容

【10】awk -F: '{if($1~/mail/) {print $1} else {print $2}}' /etc/passwd #找到匹配的行,输出该行第一个字段内容,不匹配的行输出第二个字段的内容

【11】netstat -anp|awk '$6=="LISTEN" || NR==1 {printf "%-3s %-10s %-10s %-10s ",NR,$1,$2,$3}' #匹配$6=="LISTEN"或者NR==1的行,并且格式化输出显示内容。

#printf表示格式输出

#%格式化输出分隔符

#-3长度为8个字符

#s表示字符串类型

【12】awk -F: 'BEGIN{A=0;B=0} {if($3>100) {A++; print "large"} else {B++; print "small"}} END{print A," ",B}' /etc/passwd #自定义变量,若$3>100,则A+1,否则B+1,最后输出A和B的值。

作者:linux每天一小步

出处:http://www.cnblogs.com/westoslinux

如果你真心觉得文章写得不错,而且对你有所帮助,不妨帮忙“推荐"一下,您的“推荐”将是我最大的写作动力!

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接!

免责声明:文章转载自《linux每天一小步---awk命令详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# 中的 浅表拷贝和深层拷贝01 psutils模块运用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux操作系统学习_操作系统是如何工作的

Linux操作系统学习_操作系统是如何工作的实验五:Linux操作系统是如何工作的? 学号:SA1****369 操作系统工作的基础:存储程序计算机、堆栈(函数调用堆栈)机制和中断机制       首先要整明白的一个问题是什么是存储程序计算机?其实存储程序计算机正是冯.诺依曼最初提出的计算机体系模型,现在我们一提到冯.诺依曼体系结构首先会想到的应该是包含输...

linux查看日志常用命令

linux开发常用命令: 查询服务器磁盘使用情况: df -h 根据时间查询日志: sed -n '/20200806 11:38:33/,/20200806 11:38:34/p' system-2020-08-06.0.log还可以根据时间,然后在模糊查询、grep -E 查询出来的是可以高亮显示的文本   sed -n '/20200902 1...

rootkit:实现隐藏进程

实现隐藏进程一般有两个方法: 1,把要隐藏的进程PID设置为0,因为系统默认是不显示PID为0的进程。 2,修改系统调用sys_getdents()。 Linux系统中用来查询文件信息的系统调用是sys_getdents,这一点可以通过strace来观察到,例如strace ls 将列出命令ls用到的系统调用,从中可以发现ls是通过getdents系统调用...

Linux 下安装 jdk-7u79-linux-x64.gz,jdk1.7.0_79,jdk1.7步骤:

1、首先下载对应CentOS版本的jdk:这里我下载的是jdk-7u79-linux-x64.tar.gz 2、上传到CentOS下的目录中 3、新建一个APP目录作为存储jdk的目录 4、解压jdk,使用以下命令,-C app/,是 我新建的文件夹 tar -zxvf jdk-7u79-linux-x64.tar.gz -C app/ 5、在 /etc/...

Linux内核分析:实验八--Linux进程调度与切换

刘畅 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 这篇文章主要分析Linux中,进程调度和上下文切换的过程,会涉及到进度调度的时机和进程的切换运行过程,并通过GDB跟踪Linux的schedule()函数来比較深入的理解一下这个过程。 进...

linux 下处理大文件

1、head tail more 2、先把大文件进行分割 split split参数: -a, --suffix-length=N 指定输出文件名的后缀,默认为2个 -b, --bytes=SIZE 指定输出文件的字节数 -C, --line-bytes=SIZE 每一输出档中,单行的最大 byte数 -d, --numer...