mirror of
https://github.com/johnkerl/miller.git
synced 2026-08-02 04:22:59 +00:00
279 lines
No EOL
9.4 KiB
HTML
279 lines
No EOL
9.4 KiB
HTML
|
||
<!DOCTYPE html>
|
||
|
||
<html>
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
<title>Log-processing examples — Miller 5.10.2 documentation</title>
|
||
<link rel="stylesheet" href="_static/classic.css" type="text/css" />
|
||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||
|
||
<script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
|
||
<script src="_static/jquery.js"></script>
|
||
<script src="_static/underscore.js"></script>
|
||
<script src="_static/doctools.js"></script>
|
||
<script src="_static/language_data.js"></script>
|
||
|
||
<link rel="index" title="Index" href="genindex.html" />
|
||
<link rel="search" title="Search" href="search.html" />
|
||
<link rel="next" title="Data-diving examples" href="data-examples.html" />
|
||
<link rel="prev" title="SQL examples" href="sql-examples.html" />
|
||
</head><body>
|
||
<div class="related" role="navigation" aria-label="related navigation">
|
||
<h3>Navigation</h3>
|
||
<ul>
|
||
<li class="right" style="margin-right: 10px">
|
||
<a href="genindex.html" title="General Index"
|
||
accesskey="I">index</a></li>
|
||
<li class="right" >
|
||
<a href="data-examples.html" title="Data-diving examples"
|
||
accesskey="N">next</a> |</li>
|
||
<li class="right" >
|
||
<a href="sql-examples.html" title="SQL examples"
|
||
accesskey="P">previous</a> |</li>
|
||
<li class="nav-item nav-item-0"><a href="index.html">Miller 5.10.2 documentation</a> »</li>
|
||
<li class="nav-item nav-item-this"><a href="">Log-processing examples</a></li>
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="document">
|
||
<div class="documentwrapper">
|
||
<div class="bodywrapper">
|
||
<div class="body" role="main">
|
||
|
||
<div class="section" id="log-processing-examples">
|
||
<h1>Log-processing examples<a class="headerlink" href="#log-processing-examples" title="Permalink to this headline">¶</a></h1>
|
||
<p>Another of my favorite use-cases for Miller is doing ad-hoc processing of log-file data. Here’s where DKVP format really shines: one, since the field names and field values are present on every line, every line stands on its own. That means you can <code class="docutils literal notranslate"><span class="pre">grep</span></code> or what have you. Also it means not every line needs to have the same list of field names (“schema”).</p>
|
||
<p>Again, all the examples in the CSV section apply here – just change the input-format flags. But there’s more you can do when not all the records have the same shape.</p>
|
||
<p>Writing a program – in any language whatsoever – you can have it print out log lines as it goes along, with items for various events jumbled together. After the program has finished running you can sort it all out, filter it, analyze it, and learn from it.</p>
|
||
<p>Suppose your program has printed something like this:</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ cat log.txt
|
||
op=enter,time=1472819681
|
||
op=cache,type=A9,hit=0
|
||
op=cache,type=A4,hit=1
|
||
time=1472819690,batch_size=100,num_filtered=237
|
||
op=cache,type=A1,hit=1
|
||
op=cache,type=A9,hit=0
|
||
op=cache,type=A1,hit=1
|
||
op=cache,type=A9,hit=0
|
||
op=cache,type=A9,hit=0
|
||
op=cache,type=A1,hit=1
|
||
time=1472819705,batch_size=100,num_filtered=348
|
||
op=cache,type=A4,hit=1
|
||
op=cache,type=A9,hit=0
|
||
op=cache,type=A9,hit=0
|
||
op=cache,type=A9,hit=0
|
||
op=cache,type=A9,hit=0
|
||
op=cache,type=A4,hit=1
|
||
time=1472819713,batch_size=100,num_filtered=493
|
||
op=cache,type=A9,hit=1
|
||
op=cache,type=A1,hit=1
|
||
op=cache,type=A9,hit=0
|
||
op=cache,type=A9,hit=0
|
||
op=cache,type=A9,hit=1
|
||
time=1472819720,batch_size=100,num_filtered=554
|
||
op=cache,type=A1,hit=0
|
||
op=cache,type=A4,hit=1
|
||
op=cache,type=A9,hit=0
|
||
op=cache,type=A9,hit=0
|
||
op=cache,type=A9,hit=0
|
||
op=cache,type=A4,hit=0
|
||
op=cache,type=A4,hit=0
|
||
op=cache,type=A9,hit=0
|
||
time=1472819736,batch_size=100,num_filtered=612
|
||
op=cache,type=A1,hit=1
|
||
op=cache,type=A9,hit=0
|
||
op=cache,type=A9,hit=0
|
||
op=cache,type=A9,hit=0
|
||
op=cache,type=A9,hit=0
|
||
op=cache,type=A4,hit=1
|
||
op=cache,type=A1,hit=1
|
||
op=cache,type=A9,hit=0
|
||
op=cache,type=A9,hit=0
|
||
time=1472819742,batch_size=100,num_filtered=728
|
||
</pre></div>
|
||
</div>
|
||
<p>Each print statement simply contains local information: the current timestamp, whether a particular cache was hit or not, etc. Then using either the system <code class="docutils literal notranslate"><span class="pre">grep</span></code> command, or Miller’s <code class="docutils literal notranslate"><span class="pre">having-fields</span></code>, or <code class="docutils literal notranslate"><span class="pre">is_present</span></code>, we can pick out the parts we want and analyze them:</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ grep op=cache log.txt \
|
||
| mlr --idkvp --opprint stats1 -a mean -f hit -g type then sort -f type
|
||
type hit_mean
|
||
A1 0.857143
|
||
A4 0.714286
|
||
A9 0.090909
|
||
</pre></div>
|
||
</div>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ mlr --from log.txt --opprint \
|
||
filter 'is_present($batch_size)' \
|
||
then step -a delta -f time,num_filtered \
|
||
then sec2gmt time
|
||
time batch_size num_filtered time_delta num_filtered_delta
|
||
2016-09-02T12:34:50Z 100 237 0 0
|
||
2016-09-02T12:35:05Z 100 348 15 111
|
||
2016-09-02T12:35:13Z 100 493 8 145
|
||
2016-09-02T12:35:20Z 100 554 7 61
|
||
2016-09-02T12:35:36Z 100 612 16 58
|
||
2016-09-02T12:35:42Z 100 728 6 116
|
||
</pre></div>
|
||
</div>
|
||
<p>Alternatively, we can simply group the similar data for a better look:</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ mlr --opprint group-like log.txt
|
||
op time
|
||
enter 1472819681
|
||
|
||
op type hit
|
||
cache A9 0
|
||
cache A4 1
|
||
cache A1 1
|
||
cache A9 0
|
||
cache A1 1
|
||
cache A9 0
|
||
cache A9 0
|
||
cache A1 1
|
||
cache A4 1
|
||
cache A9 0
|
||
cache A9 0
|
||
cache A9 0
|
||
cache A9 0
|
||
cache A4 1
|
||
cache A9 1
|
||
cache A1 1
|
||
cache A9 0
|
||
cache A9 0
|
||
cache A9 1
|
||
cache A1 0
|
||
cache A4 1
|
||
cache A9 0
|
||
cache A9 0
|
||
cache A9 0
|
||
cache A4 0
|
||
cache A4 0
|
||
cache A9 0
|
||
cache A1 1
|
||
cache A9 0
|
||
cache A9 0
|
||
cache A9 0
|
||
cache A9 0
|
||
cache A4 1
|
||
cache A1 1
|
||
cache A9 0
|
||
cache A9 0
|
||
|
||
time batch_size num_filtered
|
||
1472819690 100 237
|
||
1472819705 100 348
|
||
1472819713 100 493
|
||
1472819720 100 554
|
||
1472819736 100 612
|
||
1472819742 100 728
|
||
</pre></div>
|
||
</div>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ mlr --opprint group-like then sec2gmt time log.txt
|
||
op time
|
||
enter 2016-09-02T12:34:41Z
|
||
|
||
op type hit
|
||
cache A9 0
|
||
cache A4 1
|
||
cache A1 1
|
||
cache A9 0
|
||
cache A1 1
|
||
cache A9 0
|
||
cache A9 0
|
||
cache A1 1
|
||
cache A4 1
|
||
cache A9 0
|
||
cache A9 0
|
||
cache A9 0
|
||
cache A9 0
|
||
cache A4 1
|
||
cache A9 1
|
||
cache A1 1
|
||
cache A9 0
|
||
cache A9 0
|
||
cache A9 1
|
||
cache A1 0
|
||
cache A4 1
|
||
cache A9 0
|
||
cache A9 0
|
||
cache A9 0
|
||
cache A4 0
|
||
cache A4 0
|
||
cache A9 0
|
||
cache A1 1
|
||
cache A9 0
|
||
cache A9 0
|
||
cache A9 0
|
||
cache A9 0
|
||
cache A4 1
|
||
cache A1 1
|
||
cache A9 0
|
||
cache A9 0
|
||
|
||
time batch_size num_filtered
|
||
2016-09-02T12:34:50Z 100 237
|
||
2016-09-02T12:35:05Z 100 348
|
||
2016-09-02T12:35:13Z 100 493
|
||
2016-09-02T12:35:20Z 100 554
|
||
2016-09-02T12:35:36Z 100 612
|
||
2016-09-02T12:35:42Z 100 728
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
<div class="clearer"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
||
<div class="sphinxsidebarwrapper">
|
||
<h4>Previous topic</h4>
|
||
<p class="topless"><a href="sql-examples.html"
|
||
title="previous chapter">SQL examples</a></p>
|
||
<h4>Next topic</h4>
|
||
<p class="topless"><a href="data-examples.html"
|
||
title="next chapter">Data-diving examples</a></p>
|
||
<div role="note" aria-label="source link">
|
||
<h3>This Page</h3>
|
||
<ul class="this-page-menu">
|
||
<li><a href="_sources/log-processing-examples.rst.txt"
|
||
rel="nofollow">Show Source</a></li>
|
||
</ul>
|
||
</div>
|
||
<div id="searchbox" style="display: none" role="search">
|
||
<h3 id="searchlabel">Quick search</h3>
|
||
<div class="searchformwrapper">
|
||
<form class="search" action="search.html" method="get">
|
||
<input type="text" name="q" aria-labelledby="searchlabel" />
|
||
<input type="submit" value="Go" />
|
||
</form>
|
||
</div>
|
||
</div>
|
||
<script>$('#searchbox').show(0);</script>
|
||
</div>
|
||
</div>
|
||
<div class="clearer"></div>
|
||
</div>
|
||
<div class="related" role="navigation" aria-label="related navigation">
|
||
<h3>Navigation</h3>
|
||
<ul>
|
||
<li class="right" style="margin-right: 10px">
|
||
<a href="genindex.html" title="General Index"
|
||
>index</a></li>
|
||
<li class="right" >
|
||
<a href="data-examples.html" title="Data-diving examples"
|
||
>next</a> |</li>
|
||
<li class="right" >
|
||
<a href="sql-examples.html" title="SQL examples"
|
||
>previous</a> |</li>
|
||
<li class="nav-item nav-item-0"><a href="index.html">Miller 5.10.2 documentation</a> »</li>
|
||
<li class="nav-item nav-item-this"><a href="">Log-processing examples</a></li>
|
||
</ul>
|
||
</div>
|
||
<div class="footer" role="contentinfo">
|
||
© Copyright 2020, John Kerl.
|
||
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
|
||
</div>
|
||
</body>
|
||
</html> |