示例
以上的就是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。恭喜!
(责任编辑:IT) |