Linux.中国 - 开源社区

 找回密码
 骑士注册

QQ登录

微博登录


20分钟 Awk 入门

2015-2-9 20:57    评论: 28 收藏: 24 分享: 49    

示例

以上的就是Awk语言的核心内容。我这里没有大量的例子,因为我趋向于使用Awk来完成快速的一次性任务。

不过我依然有一些随身携带的脚本文件,用来处理一些事情和测试。我最喜欢的一个脚本是用来处理Erlang的崩溃转储文件,形如下面的:

=erl_crash_dump:0.3
Tue Nov 18 02:52:44 2014
Slogan: init terminating in do_boot ()
System version: Erlang/OTP 17 [erts-6.2] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
Compiled: Fri Sep 19 03:23:19 2014
Taints:
Atoms: 12167
=memory
total: 19012936
processes: 4327912
processes_used: 4319928
system: 14685024
atom: 339441
atom_used: 331087
binary: 1367680
code: 8384804
ets: 382552
=hash_table:atom_tab
size: 9643
used: 6949
...
=allocator:instr
option m: false
option s: false
option t: false
=proc:<0.0.0>
State: Running
Name: init
Spawned as: otp_ring0:start/2
Run queue: 0
Spawned by: []
Started: Tue Nov 18 02:52:35 2014
Message queue length: 0
Number of heap fragments: 0
Heap fragment data: 0
Link list: [<0.3.0>, <0.7.0>, <0.6.0>]
Reductions: 29265
Stack+heap: 1598
OldHeap: 610
Heap unused: 656
OldHeap unused: 468
Memory: 18584
Program counter: 0x00007f42f9566200 (init:boot_loop/2 + 64)
CP: 0x0000000000000000 (invalid)
=proc:<0.3.0>
State: Waiting
...
=port:#Port<0.0>
Slot: 0
Connected: <0.3.0>
Links: <0.3.0>
Port controls linked-in driver: efile
=port:#Port<0.14>
Slot: 112
Connected: <0.3.0>
...

产生下面的结果:

$ awk -f queue_fun.awk $PATH_TO_DUMP
MESSAGE QUEUE LENGTH: CURRENT FUNCTION
======================================
10641: io:wait_io_mon_reply/2
12646: io:wait_io_mon_reply/2
32991: io:wait_io_mon_reply/2
2183837: io:wait_io_mon_reply/2
730790: io:wait_io_mon_reply/2
80194: io:wait_io_mon_reply/2
...

这是在Erlang进程里运行的函数列表,它们导致了mailboxe变得很庞大。脚本在这:

# Parse Erlang Crash Dumps and correlate mailbox size to the currently running
# function.
#
# Once in the procs section of the dump, all processes are displayed with
# =proc:<0.M.N> followed by a list of their attributes, which include the
# message queue length and the program counter (what code is currently
# executing).
#
# Run as:
#
# $ awk -v threshold=$THRESHOLD -f queue_fun.awk $CRASHDUMP
#
# Where $THRESHOLD is the smallest mailbox you want inspects. Default value
# is 1000.
BEGIN {
if (threshold == "") {
threshold = 1000 # default mailbox size
}
procs = 0 # are we in the =procs entries?
print "MESSAGE QUEUE LENGTH: CURRENT FUNCTION"
print "======================================"
}

# Only bother with the =proc: entries. Anything else is useless.
procs == 0 && /^=proc/ { procs = 1 } # entering the =procs entries
procs == 1 && /^=/ && !/^=proc/ { exit 0 } # we're done

# Message queue length: 1210
# 1 2 3 4
/^Message queue length: / && $4 >= threshold { flag=1; ct=$4 }
/^Message queue length: / && $4 < threshold { flag=0 }

# Program counter: 0x00007f5fb8cb2238 (io:wait_io_mon_reply/2 + 56)
# 1 2 3 4 5 6
flag == 1 && /^Program counter: / { print ct ":", substr($4,2) }

你跟上思路没?如果跟上了,你已经了解了Awk。恭喜!

12
查看其它分页:

发表评论


最新评论

我也要发表评论

bluearrow 2015-2-11 16:32
写的很好,学习了
49 回复
魅影骑士DW 2015-2-10 08:33  新浪微博网友评论
Mark
2 回复
Biocheming 2015-2-10 03:33  新浪微博网友评论
非常有用,日常数据处理必须的!
1 回复
洋柿子专注编程入门30年 2015-2-10 00:33  新浪微博网友评论
用他处理过几行日志[泪]
2 回复
nihaoxiongfei 2015-2-10 00:03  新浪微博网友评论
mark
2 回复
苏生不惑 2015-2-10 00:03  新浪微博网友评论
linux awk入门
2 回复
志展wakeup 2015-2-9 23:33  新浪微博网友评论
@我的印象笔记
1 回复
共享World 2015-2-9 23:03  新浪微博网友评论
m
2 回复
外号手艺人的技术宅 2015-2-9 23:03  新浪微博网友评论
存着写博客
1 回复
我叫李小萌10086 2015-2-9 23:03  新浪微博网友评论
回复@Linux中国:但是awk写的东西确实很帅啊,刚工作的时候还学过一阵,后来没怎么用就都忘了,平时只写shell脚本了。
1 回复
NIcolas18 2015-2-9 23:03  新浪微博网友评论
Repost
1 回复
薛定喵的鳄 2015-2-9 23:03  新浪微博网友评论
除了面试,其他时候真的不太需要他们。@我的印象笔记
1 回复
Mike_Cao 2015-2-9 22:33  新浪微博网友评论
Mark
2 回复
感恩老大 2015-2-9 22:33  新浪微博网友评论
@我的印象笔记
1 回复
Isaac_Li时代 2015-2-9 22:33  新浪微博网友评论
Repost
1 回复
娄老师_BESTI 2015-2-9 22:33  新浪微博网友评论
@有道云笔记收藏
1 回复
Little_Beard 2015-2-9 22:03  新浪微博网友评论
[加油啊]
1 回复
马甸包包 2015-2-9 22:03  新浪微博网友评论
转!
2 回复
王宪贺V 2015-2-9 22:03  新浪微博网友评论
Mark
1 回复
ubunoon 2015-2-9 21:33  新浪微博网友评论
解释的很清楚
1 回复
12下一页

热点评论

bluearrow 2015-2-11 16:32
写的很好,学习了
49
魅影骑士DW 2015-2-10 08:33
Mark
2
Mike_Cao 2015-2-9 22:33
Mark
2
马甸包包 2015-2-9 22:03
转!
2
共享World 2015-2-9 23:03
m
2
返回顶部

分享到微信朋友圈

打开微信,点击底部的“发现”,
使用“扫一扫”将网页分享至朋友圈。