awk常用用法

Posted 坚强的小蚂蚁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了awk常用用法相关的知识,希望对你有一定的参考价值。

 

一. 基本使用方法:

awk \'{pattern + action}\' filenames  #其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令

通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本

花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。

pattern是要表示的正则表达式,可以用斜杠括起来。

 

例1:

[root@Gin scripts]# awk \'{print "hiya"}\' /etc/passwd
hiya
hiya
hiya
hiya

你将会见到/etc/passwd 文件的内容出现在眼前。现在,解释 awk 做了些什么。调用 awk时,我们指定/etc/passwd 作为输入文件。执行 awk 时,它依次对/etc/passwd 中的每一行执行 print 命令。

 

例子2

ps -ef | grep tomcat | awk \'/java/\' | awk \'{print $2}\'

这里的awk  \'/java/\' 会取出所有包含java字段的所有行,然后输出为空格为分隔符的第2个字段

 

 

二.实战案例

还以eth0的输出信息为例,取出10.0.0.7的地址段

 

方法如下

方法一
ifconfig
etho | grep "inet addr" | awk -F "[ :]+" \'{print $4}’

方法二
  ifconfig eth0 | awk -F "[ :]+" \'NR==2 {print $4}\'

 

说明

1. 使用了awk多分隔符[ :],表示以空格,或者:为分隔符,这里的【】其实是正则表达式的基本用法 

2. 符号“+”表示至少有一个空格或者冒号来做分隔符,所以“inet ”前面的11个空格可以看做是1个分隔符,所取的10.0.0.7属于第4列

3. awk的默认分隔符为空格

4. {print $4}是取第4列并输出到屏幕,$NF表示最后一列,$0表示整行,NR表示第几行。

 

 

 

三. 文本中各字段在awk中的含义

 

 

 

 例子1,取出test.txt文档中第20-30行,文本内容是1-100,每行一个整数

[root@Gin scripts]# awk \'{if(NR>=20 && NR<=30) print $1}\' test.txt   
20
21
22
23
24
25
26
27
28
29
30

 

例子2,若test.txt文本内容为  "I am Poe,my qq is 33794712",请从该文件中过滤出\'Poe\'字符串与33794712,最后输出的结果为:Poe 33794712

[root@Gin scripts]# awk -F \'[ ,]+\' \'{print $3" "$7}\' test.txt
Poe 33794712

 

 

 

 

四. BEGIN和END模块

通常,对于每个输入行, awk 都会执行每个脚本代码块一次。然而,在许多编程情况中,可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码。对于这种情况, awk 允许您定义一个 BEGIN 块。

因为 awk 在开始处理输入文件之前会执行 BEGIN 块,因此它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。
awk 还提供了另一个特殊块,叫作 END 块。 awk 在处理了输入文件中的所有行之后执行这个块。通常, END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息

 

例1. 统计/etc/passwd的账户人数

[root@Gin scripts]# awk \'{count++;print $0;} END{print "user count is ",count}\' passwd
root:x:0:0:root:/root:/bin/bash
..............................................
user count is  27

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

[root@Gin scripts]# awk \'BEGIN {count=0;print "[start] user count is ",count} {count=count+1;print $0} END{print "[end] user count is ",count}\' passwd
[start] user count is  0
root:x:0:0:root:/root:/bin/bash
...................................................................
[end] user count is  27

 

 

例2:统计某个文件夹下的文件占用的字节数

[root@Gin scripts]# ll |awk \'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ",size}\'
[end]size is  1489

如果以M为单位显示:

[root@Gin scripts]# ll |awk \'BEGIN{size=0;} {size=size+$5;} END{print "[end]size is ",size/1024/1024,"M"}\'   
[end]size is  0.00142002 M

 

以上是关于awk常用用法的主要内容,如果未能解决你的问题,请参考以下文章

Linux常用基本命令:三剑客命令之-awk模式用法

Linux常用基本命令:三剑客命令之-awk模式用法

Linux常用基本命令:三剑客命令之-awk动作用法

sed awk grep三剑客常用

3. linux常用命令及三剑客 grep sed awk 用法

awk的用法