awk命令使用方法

摘要:
Pattern是要表达的正则表达式,用斜线括起来。在本例中,awk允许您定义BEGIN块。因为awk在开始处理输入文件之前执行BEGIN块,所以它是初始化FS变量、打印头或初始化程序稍后将引用的其他全局变量的绝佳位置。Awk还提供了另一个特殊的块,称为END块。Awk在处理输入文件中的所有行后执行此块。

1、基本语法

awk '{pattern + action}' {filenames}

awk语法中pattern表示在数据中查找的内容,而action是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。pattern就是要表示的正则表达式,用斜杠括起来。

2、awk原理

awk 对输入文件中的每一行都执行这个脚本:

awk命令使用方法第1张

$ awk -F":" '{ print $1 }' /etc/passwd
$ awk -F":" '{ print $1 $3 }' /etc/passwd
$ awk -F":" '{ print $1 " " $3 }' /etc/passwd
$ awk -F":" '{ print "username: " $1 "		uid:" $3" }' /etc/passwd

-F参数:指定分隔符,可指定一个或多个
print 后面做字符串的拼接
NF:一条记录中用分割符分隔开来的字段数目

NR:已经读出的记录数,就是行号,从1开始

实例一:只查看test.txt文件(100行)内第20到第30行的内容

[root@local]# awk '{if(NR>=5 && NR<=10) print $1}' test.txt   
5
6
7
8
9
10

实例二:已知test.txt文件内容为

[root@local]# cat test.txt
I am Poe,my qq is 168

请从该文件中过滤出'Poe'字符串与168,最后输出的结果为:Poe 168

[root@local]# awk -F '[ ,]+' '{print $3" "$7}' test.txt
Poe 168

3、BEGIN和END模块

通常,对于每个输入行,awk 都会执行每个脚本代码块一次。然而,在许多编程情况中,可能需要在awk开始处理输入文件中的文本之前执行初始化代码。对于这种情况,awk允许您定义一个BEGIN块。
因为awk在开始处理输入文件之前会执行BEGIN块,因此它是初始化FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。

awk还提供了另一个特殊块,叫作END块。awk在处理了输入文件中的所有行之后执行这个块。通常,END块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。

实例一:统计/etc/passwd的账户人数

[root@local]# awk '{count++;print $0;} END{print "user count is ",count}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
………………………………………………………………………………
www:x:80:80::/home/www:/bin/bash
user count is  25

count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开。这里没有初始化count,虽然默认是0,但是妥当的做法还是初始化为0:

[root@local]# awk 'BEGIN {count=0;print "[start] user count is ",count} {count=count+1;print $0} END{print "[end] user count is ",count}' /etc/passwd
[start] user count is  0
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
………………………………………………………………………………
www:x:80:80::/home/www:/bin/bash
[end] user count is  25
实例二:统计某个文件夹下的文件占用的字节数
[root@local]# ll |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ",size}'
[end]size is  24692

如果以MB为单位显示:

[root@local]# ll |awk 'BEGIN{size=0;} {size=size+$5;} END{print "[end]size is ",size/1024/1024,"MB"}'
[end]size is  0.0235481 MB

4、awk运算符

awk命令使用方法第2张

awk赋值运算符:a+=5;等价于:a=a+5;其他同类

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

awk逻辑运算符:输出中0代表False,1代表True

[root@local]# awk 'BEGIN {a=1;b=2;print (a>2 && b>1,a=1 || b>1)}'
0 1

awk正则运算符:a所赋的值中包含100则输出ok

[root@local]# awk 'BEGIN{a="100testaa";if(a~/100/) {print "ok"}}'
ok
[root@local]# echo | awk 'BEGIN{a="test100"}a~/test/{print "ok"}'
ok
关系运算符:

如: > <可以作为字符串比较,也可以用作数值比较,关键看操作数如果是字符串就会转换为字符串比较。两个都为数字才转为数值比较。字符串比较:按照ascii码顺序比较。

[root@local]# awk 'BEGIN{a="11";if(a>=9){print "ok"}}' #无输出
[root@local]# awk 'BEGIN{a=11;if(a>=9){print "ok"}}' 
ok
[root@local awk 'BEGIN{a;if(a>=b){print "ok"}}'
ok
awk算术运算符:

说明,所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0。

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

5、常用awk内置变量

awk命令使用方法第3张

注:内置变量很多,参阅相关资料

字段分隔符FS

FS=" " 一个或多个Tab分隔

[root@local]# cat test.txt
ww   CC        IDD
[root@local]# awk 'BEGIN{FS="	+"}{print $1,$2,$3}' test.txt
ww   CC        IDD

FS="[[:space:]+]" 一个或多个空白空格,默认的 

[root@local]# cat test.txt
we are    studing awk now!
[root@local]# awk -F [[:space:]+] '{print $1,$2,$3,$4,$5}' test.txt
we are  
[root@local]# awk -F [[:space:]+] '{print $1,$2}' test.txt
we are

FS="[" ":]+" 以一个或多个空格或:分隔 

[root@local]# cat test.txt
root:x:0:0:root:/root:/bin/bash
[root@local]# awk -F [" ":]+ '{print $1,$2,$3}' test.txt
root x 0

字段数量NF

[root@local]# cat test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin:888
[root@local]# awk -F ":" 'NF==8{print $0}' test.txt
bin:x:1:1:bin:/bin:/sbin/nologin:888

记录数量NR

[root@local]# ifconfig eth0|awk -F [" ":]+ 'NR==2{print $4}'  ## NR==2也就是取第2行
192.168.168.10
RS记录分隔符变量

将FS设置成" "告诉awk每个字段都占据一行。通过将RS设置成"",还会告诉awk每个地址记录都由空白行分隔。

[root@local]# cat area.txt
Jimmy the Weasel
100 Pleasant Drive
San Francisco,CA 123456
 
Big Tony
200 Incognito Ave.
Suburbia,WA 64890
[root@local]# cat awk.txt
#!/bin/awk
BEGIN {
        FS="
"
        RS=""
}
{
        print $1","$2","$3
}
[root@local]# awk -f awk.txt area.txt
Jimmy the Weasel,100 Pleasant Drive,San Francisco,CA 123456
Big Tony,200 Incognito Ave.,Suburbia,WA 64890

OFS输出字段分隔符 

[root@local]# cat hello.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin:888
[root@local]# awk 'BEGIN{FS=":"}{print $1","$2","$3}' hello.txt
root,x,0
bin,x,1
[root@local]# awk 'BEGIN{FS=":";OFS="#"}{print $1,$2,$3}' hello.txt
root#x#0
bin#x#1

ORS输出记录分隔符

[root@local]# cat area.txt
Jimmy the Weasel
100 Pleasant Drive
San Francisco,CA 123456
 
Big Tony
200 Incognito Ave.
Suburbia,WA 64890
[root@local]# cat awk.txt
#!/bin/awk
BEGIN {
        FS="
"
        RS=""
        ORS="

"
}
{
        print $1","$2","$3
}
[root@local]# awk -f awk.txt area.txt
Jimmy the Weasel,100 Pleasant Drive,San Francisco,CA 123456
 
Big Tony,200 Incognito Ave.,Suburbia,WA 64890

6、awk正则

awk命令使用方法第4张

正则应用
规则表达式

awk '/REG/{action}' file,/REG/为正则表达式,可以将$0中,满足条件的记录送入到:action进行处理

[root@local]# awk '/root/{print $0}' passwd ##匹配所有包含root的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
 
[root@local]# awk -F: '$5~/root/{print $0}' passwd  ## 以分号作为分隔符,匹配第5个字段是root的行
root:x:0:0:root:/root:/bin/bash
 
[root@local]# ifconfig eth0|awk 'BEGIN{FS="[[:space:]:]+"} NR==2{print $4}'
192.168.168.10

布尔表达式
awk '布尔表达式{action}' file仅当对前面的布尔表达式求值为真时,awk才执行代码块。

[root@local]# awk -F: '$1=="root"{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@local]# awk -F: '($1=="root")&&($5=="root") {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

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

上篇Android 修改 keystore 信息sql基础内容2下篇

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

相关文章

Jumpserver-堡垒机

Jumpserver-堡垒机 1.基于Docker搭建Jumpserver堡垒机 1.1 下载镜像 1.2 运行镜像 1.2.1 官网步骤—Docker快速启动 1.3 浏览器访问 2.Jumpserver使用 2.1 管理用户 2.2 资产管理 2.2.1 资产管理-管理其他服务器 2.3 系统用户 2.3.1 系统用户sudo权限 3.测...

ansible-基础命令

命令格式 absible <主机或者分组列表> [选项] //ansible all 就是全部主机 -M 指定模块路径 -m 使用模块,默认是command模块 -a或者--args 模块参数 -i是inventory文件路径或者可执行脚本 -k 使用交互式登陆密码 -e 定义变量 -v详细信息,-vvvv开启debug模式 ansible...

在TOMCAT下配置工程的默认访问设置(转)

对工程的部署一般是将工程的压缩文件放在tomcat安装目录的webapps下,访问时通过键入:http://localhost:8080/xx(假定为本机访问,xx是部署时的应用工程的访问名字)。 而如果直接键入:http://localhost:8080出来的将是tomcat自带的欢迎页面,如何让键入http://localhost:8080出来的是自己...

jQuery Mobile 列表视图(带有自动检索)

输入a: 输入b: jQuery Mobile 列表视图 jQuery Mobile 中的列表视图是标准的 HTML 列表:有序列表 (<ol>) 和无序列表 (<ul>)。 如需创建列表,请向 <ol> 或 <ul> 元素添加 data-role="listview"。如需使这些项目可点击,请在每个列...

Doskey命令详解

转自:https://blog.csdn.net/u012993732/article/details/48626921 调用 Doskey.exe,它撤回 Windows XP 命令、编辑命令行并创建宏。 MS-DOS命令语法 doskey {/reinstall | /listsize=size | /macros:[{all | exename}]...

shell入门-grep过滤-1

正则表达式,就是一个字符串。有一定的规律。我们用指定的字符串匹配一个指定的行。指定的字符串就是正则表达式。 正则表达式有这几个工具:grep egrep sed awk 命令:gerep 说明:过滤出指定的行 选项:--color  关键字有颜色         -n  显示行号        -c   显示一共出现了多少行        -v  取反 不...