Linux下的awk使用

摘要:
awk介绍Awk是一种编程语言,主要用于linux/unix下对文本和数据进行扫描处理,数据可以来自标准输入,文件和管道,拥有众多的发行版本,awk,nawk,gawk,MKSawk,tawk,最常用的是mawk,gawkrhel系统默认的是gawk;ubuntu系列产品用mawkawk工作流程awk基本结构由模式匹配和处理过程(动作)组成,pattern+action首先对文件进行逐行扫描,从第一行到最后一行,逐行进行匹配特定模式的行,并在这些行上进行用户想要的操作。awk有两个特殊模式:BEGIN和END,被放置在没有读取任何数据之前以及在所有数据读取完之后执行。

awk介绍

Awk 是一种编程语言,主要用于linux/unix下对文本和数据进行扫描处理,数据可以来自标准输入,文件和管道,拥有众多的发行版本,awk,nawk,gawk,MKS awk, tawk, 最常用的是mawk,gawk

rhel系统默认的是 gawk;ubuntu系列产品用mawk

awk 工作流程

awk基本结构由模式匹配和处理过程(动作)组成,pattern+action

首先对文件进行逐行扫描,从第一行到最后一行,逐行进行匹配特定模式的行,并在这些行上进行用户想要的操作。在读取文件每一行时,判断是否与给定的模式相匹配,如果匹配,则执行处理过程,否则不做任何操作;如果没有指定的脚本,则把匹配的行标准输出,默认处理动作为print打印;如果没有指定模式匹配,则默认匹配所有数据。

awk有两个特殊模式:BEGIN和END ,被放置在没有读取任何数据之前以及在所有数据读取完之后执行。

awk的基础语法

awk [选项] ‘{[pattern] + action}'[filenames]

选项

-F fs, 指定fs为输入行的分隔符,默认的分隔符为空格或者制表符

-v var=val , 在处理动作之前,设置一个变量var,值为val

-f program-fle ,从脚本中读取awk指令,以取代在命令参数中输入脚本

-W compat ,使用兼容模式运行awk,GUN拓展选项将被忽略

-W dump-variables[=file] , 打印全局变量到文件中

awk 程序语法结构:一个awk程序包含一系列的模式(动作指令)或者函数,定义模式可以使用BEGIN/END/表达式 ,用来限定操作对象的多个表达式使用逗号隔开,动作指令使用{}括起来

一、awk操作指令

1. 内置变量

变量名 描述

ARGC 命令行参数个数
FILENAME 当前输入文档的名称
FNR 当前输入文档的记录编号,多个输入文档时有用
NR 输入流当前记录编号
NF 当前记录的字段个数
FS   字段分割符
OFS   输出字段分割符,默认空格
ORS   输出记录分隔符,默认换行符
RS    输入记录分隔符,默认换行符

打印当前文档的当前编号,两个文件是分开的

[root@centos7 ~]# awk '{print FNR}' awktest.txt test.txt

awk将两个文件作为一个整体输入流,通过NR输入当前编号

[root@centos7 ~]# awk '{print NR}' awktest.txt test.txt

通过OFS将输出分隔符设置为‘_’

[root@centos7 ~]# echo hello the wold |awk 'BEGIN {OFS="_"} {print $1,$2,$3}'

>>hello_the_wold

读取输入输出,以空白行为分隔符

[root@centos7 ~]# awk 'BEGIN {FS=" ";RS=""} {print $1}' awktest.txt

2. 记录与字段

awk 一次从文件中读取一条记录,并将记录存储在字段变量$0中,记录被分割为字段存储在$1,$2,$3......$NF 中(分隔符默认为空格或制表符)

输出第一个和最后一个字段

[root@centos7 ~]# echo hello the wold |awk '{print $1,$NF}'

>>hello wold

3. 分隔符

输出以t为分割符的最后一个字段

[root@centos7 ~]# echo hello the wold |awk -F"t" '{print $NF}'

[root@centos7 ~]# echo hello the wold |awk 'BEGIN {FS="t"} {print $NF}'

>>he wold

多个分隔符,输出以t 和w 分割的第一和最后一个字段

[root@centos7 ~]# echo hello the wold |awk -F"[t,w]" '{print $1,$NF}'

>>helloold

4. 表达式

表达式 由变量,常量,正则表达式,操作符组成

awk中变量有字符和数字常量,如果在awk中定义变量没有初始化,则初始化值为空字符或0,字符操作一定要加引号

同python中的表达式都差不多,大于小于等于,小于等于,++,-- .....

~ 匹配

!~ 不匹配

|| 或

&& 与

[root@centos7 ~]# echo hello |awk 'x=1,y=2 {print x*2,y*3}'

>>2 6

统计空白行数

[root@centos7 ~]# awk '/^$/ {x+=1} END{print x}' awktest.txt

打印root用户的uid号

[root@centos7 ~]# awk -F":" '$1~/root/ {print $3}' /etc/passwd

0

[root@centos7 ~]# awk -F: '$1~/root/ {print $3}' /etc/passwd

0

打印用户uid大于500的用户

[root@centos7 ~]# awk -F: '$3>500 {print $1}' /etc/passwd

二、awk中的循环语句

1. if 语句

格式:

if(表达式) 动作1 ;else 动作2

例子:

打印 磁盘中boot下的可使用值,小于1000 打印ERROR,否则打印OK

[root@centos7 ~]# df |grep boot|awk '{if($4<1000) print "ERROR";else print "OK"}'

>>OK

2 . while 语句

格式1:

while(条件){动作1;动作2}

[root@centos7 ~]# awk ' BEGIN {while(i<5){print i ;i++}}'

格式2:

do {动作} while (条件)

[root@centos7 ~]# awk ' BEGIN {do{print i;i++}while(i<5)}'

[root@centos7 ~]# echo hello| awk '{i=2;while(i<5){print i ;i++}}'

[root@centos7 ~]# awk -F: '$1~/root/{i=1;while(i<=NF){print i $i;i++}}' /etc/passwd

1root

2x

30

40

5root

6/root

7/bin/bash

3. for 语句

格式:

for(变量;条件;计数器) { 动作}

[root@centos7 ~]# echo hello|awk '{for(i=1;i<5;i++){print i}}'

统计/etc/passwd 下$7的个数

[root@centos7 ~]# # awk -F: '{a[$7]++}END{for(i in a){if(i !="") print i":"a[i]}}' /etc/passwd

/bin/sync:1

/bin/bash:2

/sbin/nologin:38

/sbin/halt:1

/sbin/shutdown:1

4. continue 和break

[root@centos7 ~]# echo hello |awk '{for(i=1;i<5;i++){if(i==3) break;print i}}'

1

2

[root@centos7 ~]# echo hello |awk '{for(i=1;i<5;i++){if(i==3) continue;print i}}'

1

2

4

三、awk中的函数

1. rand()函数

随机产生一个0-1之间的浮点数,需要和srand() 配合使用,否则产生的rand()随机数都相同

[root@centos7 ~]# echo hello|awk '{srand();print rand()}'

2. gsub(x,y,z)函数 --全局替换

替换函数: x替换为y ,z为字串,默认是$0

在字串z中使用字符y替换 正则表达式x匹配的字串

[root@centos7 ~]# awk 'gsub(/is/,"are",$0){print $0}' awktest.txt

3. sub(x,y,z)函数 --替换第一个

替换函数: x替换为y ,z为字串,默认是$0

在字串z中使用字符y替换 正则表达式x匹配的第一个字串

[root@centos7 ~]# awk 'sub(/is/,"are",$0){print $0}' awktest.txt

gsub 相当于sed中的 s///g

sub 想当于 sed中的s///

4. length(z)函数

返回字串z的长度

[root@centos7 ~]# awk '{print length(z)}' awktest.txt

5. getline 函数

从输入中读取下一行内容

[root@centos7 ~]#

df -h |awk 'BEGIN{print "DISK FREE"}{if(NF==1){getline;print $3};if(NF==6){print $4}}'

DISK FREE

可用

5.7G

471M

487M

478M

487M

223M

4.0G

98M

98M

免责声明:文章转载自《Linux下的awk使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Thinkpad 笔记本待机亮度变低解决办法关于form表单提交时required属性失效的问题下篇

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

相关文章

linux上kafka搭建小结

1、安装java yum -y list java 可以查看java的版本,然后选1.8的64位那个安装 yum install java_1.8.0_openjdk.x86_64 或者从网站下载安装 tar -zxvf jre-8u271-linux-x64.tar.gzmkdir /usr/lib/jvmmv jre-8u271-linux-x64 /...

不同linux禁用nouveau驱动方法

不同Linux系统nouveau驱动禁用方式 Fedora 创建文件/usr/lib/modprobe.d/blacklist-nouveau.conf,添加如下文本: blacklist nouveau options nouveau modeset=0 重新生成initramfs。 $ sudo dracut --force RHEL/Cent...

Linux设备驱动——内核定时器

内核定时器使用 内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于<Linux/timer.h>和kernel/timer.c文件中。 被调度的函数肯定是异步执行的,它类似于一种“软件中断”,而且是处于非进程的上下文中,所以调度函数必须遵守以下规则: 1)没有current指针、不允许访问用户空...

win8和win7下解决php5.3和5.4、5.5等不能加载php_curl.dll的终极解决办法

最近分别在WIN7和Windows8 上分别安装php 高版本!都遇到了这个问题! 一.win7系统32位, apache2.2, php5.2升级到5.4. 这个比较容易: 1. phpinfo发现没有加载curl; 2. 在php.ini中设置extension_dir 指向e:php5.4ext; 部分php扩展加载了, 但curl仍不行。 3. 设...

Linux C/C++编程之(十九)进程组守护进程

文章目录 一、概述 二、进程组与守护进程 1. 进程组 2. 进程组操作函数 3. 会话 4. 守护进程 一、概述 二、进程组与守护进程 1. 进程组 进程组,也称之为作业。BSD于1980年前后向Unix中增加的一个新特性,代表一个或多个进程的集合,每个进程都属于一个进程组。在waitpid函数和kill函数的参数中都曾使用到。操作系...

[笔记]--Xbrowser远程连接Linux桌面环境

配置GDM。 CentOS 5的默认图形环境为Gnome,只安装了GDM,而CentOS 5的KDE也是使用GDM而不是KDM。所以CentOS 5只需配置GDM。 编辑/etc/gdm/custom.conf,添加如下内容: [security] AllowRemoteRoot=true 注:允许root用户远程登录 [xdmcp] Enable...