码迷,mamicode.com
首页 > 其他好文 > 详细

awk常用用法

时间:2018-03-01 11:40:19      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:取出   ddr   脚本   占用   代码块   eth0   .com   编程   默认   

 

一. 基本使用方法:

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常用用法

标签:取出   ddr   脚本   占用   代码块   eth0   .com   编程   默认   

原文地址:https://www.cnblogs.com/regit/p/8487078.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!