找回密码
 骑士注册

QQ登录

微博登录


20分钟 Awk 入门

2015-02-09 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-02-11 16:32 49 回复
写的很好,学习了
魅影骑士DW 2015-02-10 08:33  新浪微博网友评论 2 回复
Mark
Biocheming 2015-02-10 03:33  新浪微博网友评论 1 回复
非常有用,日常数据处理必须的!
洋柿子专注编程入门30年 2015-02-10 00:33  新浪微博网友评论 2 回复
用他处理过几行日志[泪]
nihaoxiongfei 2015-02-10 00:03  新浪微博网友评论 2 回复
mark
苏生不惑 2015-02-10 00:03  新浪微博网友评论 2 回复
linux awk入门
志展wakeup 2015-02-09 23:33  新浪微博网友评论 1 回复
@我的印象笔记
共享World 2015-02-09 23:03  新浪微博网友评论 2 回复
m
外号手艺人的技术宅 2015-02-09 23:03  新浪微博网友评论 1 回复
存着写博客
我叫李小萌10086 2015-02-09 23:03  新浪微博网友评论 1 回复
回复@Linux中国:但是awk写的东西确实很帅啊,刚工作的时候还学过一阵,后来没怎么用就都忘了,平时只写shell脚本了。
NIcolas18 2015-02-09 23:03  新浪微博网友评论 1 回复
Repost
薛定喵的鳄 2015-02-09 23:03  新浪微博网友评论 1 回复
除了面试,其他时候真的不太需要他们。@我的印象笔记
Mike_Cao 2015-02-09 22:33  新浪微博网友评论 2 回复
Mark
感恩老大 2015-02-09 22:33  新浪微博网友评论 1 回复
@我的印象笔记
Isaac_Li时代 2015-02-09 22:33  新浪微博网友评论 1 回复
Repost
娄老师_BESTI 2015-02-09 22:33  新浪微博网友评论 1 回复
@有道云笔记收藏
Little_Beard 2015-02-09 22:03  新浪微博网友评论 1 回复
[加油啊]
马甸包包 2015-02-09 22:03  新浪微博网友评论 2 回复
转!
王宪贺V 2015-02-09 22:03  新浪微博网友评论 1 回复
Mark
ubunoon 2015-02-09 21:33  新浪微博网友评论 1 回复
解释的很清楚
abenrat 2015-02-09 21:33  新浪微博网友评论 回复
Linux中国 2015-02-09 21:33  新浪微博网友评论 回复
回复@我叫李小萌10086:它们认为自己是一种语言~
我叫李小萌10086 2015-02-09 21:33  新浪微博网友评论 回复
作为一个命令,或者工具来说,sed和awk都有点太复杂了
guilinluohanguo 2015-02-09 21:33  新浪微博网友评论 回复
非常有用的小工具
CodePanda 2015-02-09 21:33  新浪微博网友评论 回复
@我的印象笔记 @有道云笔记收藏
Loe隆_碎碎 2015-02-09 21:03  新浪微博网友评论 回复
ma
cchalpha 2015-02-09 21:03  新浪微博网友评论 回复
@stephen_小昕
_BrianChen 2015-02-09 21:03  新浪微博网友评论 回复
@我的印象笔记
返回顶部

分享到微信朋友圈

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