shell-awk

参考知识:
[url]http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html[/url]
[url]http://man.lupaworld.com/content/manage/ringkee/awk.htm[/url]
awk 是一个非常有用的文本处理工具。

特点:awk擅长将一行记录分割多个字段来分别处理的需求。

惯用模式:awk '条件类型1 {动作1} 条件类型2 {动作2}' filename

$0 :当前处理行记录
$1: 第一个分段
NF:每一行拥有的字段总数
NR:当前awk处理的第几行数据
FS:目前的分割字符,默认是空格。

[b]BEGIN语句在所有文本处理动作执行之前被执行,比如:定义变量。
END语句在所有文本处理动作执行完之后才被执行。END语句在脚本中的位置放置在主要动作之后。 只执行一次,比如:输出最终结果。[/b]
注意点:与bash shell的变量不同,在awk中,变量可以直接使用,不需要加$符合。

指定分隔符:

echo "a#b@c" |awk -F '[#@]' '{print $1 " " $2 " " $3}'

结果:
a b c

求最大值:

cat num.txt |awk 'BEGIN{a=0}{if ($1>a) a=$1 fi}END{print a}'


[b]实践案例1:[/b]
获取ip地址

ifconfig | grep "inet addr"


结果:总共两行记录

inet addr:192.168.234.134 Bcast:192.168.234.255 Mask:255.255.255.0
inet addr:127.0.0.1 Mask:255.0.0.0

下面我们将 inet addr: 去掉

ifconfig | grep "inet addr"|sed 's/^.*inet addr://g'

结果:
192.168.234.134 Bcast:192.168.234.255 Mask:255.255.255.0
127.0.0.1 Mask:255.0.0.0

下面输出第一个字段的记录


ifconfig | grep "inet addr"|sed 's/^.*inet addr://g'|awk '{print $1}'


输出:
192.168.234.134
127.0.0.1


[b]实践案例2:[/b]
对一个文本的所有行进行求和。


cat num.txt

输出:
1
2
3
4
5
6
7
8
9
10

awk '{num+=$1} END {print num}' num.txt

输出:55

案例3:
求一个数字文件里的和。


cat num2.txt

结果:
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28


for i in `cat num2.txt` ;do echo $i; done |awk 'BEGIN {a=0} {a+=$1} END {print a}'

结果:
406

案例4:
统计每个ip出现的次数。

178.60.128.31 www.google.com.hk
193.192.250.158 www.google.com
210.242.125.35 adwords.google.com
210.242.125.35 accounts.google.com.hk
210.242.125.35 accounts.google.com
210.242.125.35 accounts.l.google.com
64.233.181.49 www.google.com
212.188.10.167 www.google.com
23.239.5.106 www.google.com
64.233.168.41 www.google.com
62.1.38.89 www.google.com
62.1.38.89 chrome.google.com
193.192.250.172 www.google.com
212.188.10.241 www.google.com
37.228.69.57 www.google.com
222.255.120.42 www.google.com
222.255.120.42 www.gstatic.com
212.188.10.167 www.googleapis.com
64.233.181.49 www.googleapis.com
64.233.181.49 fonts.googleapis.com
193.192.250.158 plus.google.com
193.192.250.158 talkgadget.google.com
193.192.250.158 ssl.gstatic.com
193.192.250.158 images-pos-opensocial.googleusercontent.com
193.192.250.158 images1-focus-opensocial.googleusercontent.com
193.192.250.158 images2-focus-opensocial.googleusercontent.com
193.192.250.158 images3-focus-opensocial.googleusercontent.com
193.192.250.158 images4-focus-opensocial.googleusercontent.com
193.192.250.158 images5-focus-opensocial.googleusercontent.com
193.192.250.158 images6-focus-opensocial.googleusercontent.com
193.192.250.158 clients4.google.com
222.255.120.42 google.com
222.255.120.42 apis.google.com
222.255.120.42 clients1.google.com
193.192.250.158 clients2.google.com
193.192.250.158 clients3.google.com
193.192.250.158 clients5.google.com
64.233.181.49 maps.google.com
64.233.181.49 mts0.google.com
64.233.181.49 maps.gstatic.com

shell 代码:

awk '{ab[$1]++;}END{for(i in ab){print i , ab[i] }}' data.txt

输出:
212.188.10.241 1
64.233.168.41 1
23.239.5.106 1
193.192.250.158 15
178.60.128.31 1
37.228.69.57 1
212.188.10.167 2
193.192.250.172 1
62.1.38.89 2
64.233.181.49 6
210.242.125.35 4
222.255.120.42 5


案例5:
统计每个key对应的值的总和

4,3
5,4
4,2
2,93
3,32
4,49
5,20
6,2
8,1
2,1
3,1
4,3
2,7


awk -F',' '{ab[$1]=ab[$1]+$2;}END{for(i in ab){print i , ab[i] }}' a.txt |sort

输出:
2 101
3 33
4 57
5 24
6 2
8 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值