{"id":311,"date":"2018-04-16T11:57:58","date_gmt":"2018-04-16T10:57:58","guid":{"rendered":"http:\/\/hslomka.de\/techno\/?p=311"},"modified":"2018-04-16T11:57:58","modified_gmt":"2018-04-16T10:57:58","slug":"mehrfache-eintrage-in-grosen-konfigurationsdateien-oder-protokollen-finden","status":"publish","type":"post","link":"https:\/\/techno.slomka.biz\/?p=311","title":{"rendered":"Mehrfache Eintr\u00e4ge in gro\u00dfen Konfigurationsdateien oder Protokollen finden (Linux\/Unix L\u00f6sung)"},"content":{"rendered":"<p>Oft vermutet man in gr\u00f6\u00dferen Protokolldateien oder Konfigurationsdateien mehrfach vorhandene Eintr\u00e4ge. Diese sollen schnell ermittelt und bei Bedarf entfernt werden.<br \/>\nUnter Linux gibt es das Werkzeug uniq. Der Parameter <code>--count<\/code> gibt alle Zeilen aus und die H\u00e4ufigkeit Ihres Auftretens in der ersten Spalte. Es funktioniert nur nicht so intuitiv, wie erwartet. Ich versuche es an einem Beispiel:<br \/>\n<code><\/code><\/p>\n<p class=\"kasten\">uniq &#8211;count console.log<\/p>\n<p class=\"einzug\">1 &lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243; ?&gt;<br \/>\n1 &lt;Protokollzeile xxxyyyzzz &gt;<\/p>\n<p>\nDiese Datei hat offensichtlich zwei Zeilen insgesamt und beide unterscheiden sich. Das ist im Moment nicht sehr hilfreich. Daher verdoppele ich die Datei und f\u00fcge eine einzeln vorkommende Zeile hinzu:<br \/>\n<code><\/code><\/p>\n<p class=\"kasten\">cat console.log >> consoleDup.log<br \/>\ncat console.log >> consoleDup.log<br \/>\necho &#8220;Eine abweichende Zeile >> consoleDup.log\n<\/p>\n<\/p>\n<p>Eine erneute \u00dcberpr\u00fcfung mit uniq zeigt das Problem:<br \/>\n<code><\/code><\/p>\n<p class=\"kasten\">uniq &#8211;count consoleDup.log<\/p>\n<p class=\"einzug\">1 &lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243; ?&gt;<br \/>\n1 &lt;Protokollzeile xxxyyyzzz &gt;<br \/>\n1 &lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243; ?&gt;<br \/>\n1 &lt;Protokollzeile xxxyyyzzz &gt;<br \/>\n1 Eine abweichende Zeile<\/p>\n<p>\nGenau, das wollten wir so nicht sehen. Die erste und dritte Zeile und die zweite und vierte Zeile sind identisch. Da sollte eine 2 stehen.<br \/>\nAus dem gleichen Grund funktioniert <code>uniq --unique<\/code> nicht, solange die Datei nicht sortiert vorliegt. In den meisten F\u00e4llen (XML, JSON etc) Dazeien w\u00fcrde die Sortierung die Datei unbrauchbar machen.<\/p>\n<p>Zur L\u00f6sung des Problems m\u00fcssen die Zeilen sortiert werden.<br \/>\n<code><\/code><\/p>\n<p class=\"kasten\">sort consoleDup.log|uniq &#8211;count<\/p>\n<p class=\"einzug\">1 Eine abweichende Zeile<br \/>\n2 &lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243; ?&gt;<br \/>\n2 &lt;Protokollzeile xxxyyyzzz &gt;<\/p>\n<p>\nSchon besser. Der uniq Parameter <code>--repeated<\/code> gibt nur die mehrfach vorkommenden Zeilen aus:<br \/>\n<code><\/code><\/p>\n<p class=\"kasten\">sort consoleDup.log|uniq &#8211;count &#8211;repeated<\/p>\n<p>2 &lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243; ?&gt;<br \/>\n2 &lt;Protokollzeile xxxyyyzzz &gt;<br \/>\nDoppelt oder noch h\u00e4ufiger vorkommende Zeilen in Textdaten k\u00f6nnen schnell und elegant mit awk entfernt werden:<br \/>\n<code><\/code><\/p>\n<p class=\"kasten\">awk &#8216;!seen[$0]++&#8217; consoleDup.log >> console_noDupRecords.log<br \/>\ncat console_noDupRecords.log<\/p>\n<p class=\"einzug\">&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243; ?&gt;<br \/>\n&lt;Protokollzeile xxxyyyzzz &gt;<\/p>\n<\/p>\n<p>Eine L\u00f6sung f\u00fcr die Powershell zeige ich <a href=\"http:\/\/hslomka.de\/techno\/?p=340\">hier<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oft vermutet man in gr\u00f6\u00dferen Protokolldateien oder Konfigurationsdateien mehrfach vorhandene Eintr\u00e4ge. Diese sollen schnell ermittelt und bei Bedarf entfernt werden. Unter Linux gibt es das Werkzeug uniq. Der Parameter &#8211;count gibt alle Zeilen aus und die H\u00e4ufigkeit Ihres Auftretens in der ersten Spalte. Es funktioniert nur nicht so intuitiv, wie erwartet. Ich versuche es an einem Beispiel: uniq &#8211;count console.log 1 &lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243; ?&gt; 1 &lt;Protokollzeile xxxyyyzzz &gt; Diese Datei hat offensichtlich zwei Zeilen insgesamt und beide unterscheiden sich. Das ist im Moment nicht sehr hilfreich. Daher verdoppele ich die Datei und f\u00fcge eine einzeln vorkommende Zeile hinzu: cat console.log >> consoleDup.log cat console.log >> consoleDup.log echo &#8220;Eine abweichende Zeile >> consoleDup.log Eine erneute \u00dcberpr\u00fcfung mit uniq zeigt das Problem: uniq &#8211;count consoleDup.log 1 &lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243; ?&gt; 1 &lt;Protokollzeile xxxyyyzzz &gt; 1 &lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243; ?&gt; 1 &lt;Protokollzeile xxxyyyzzz &gt; 1 Eine abweichende Zeile Genau, das wollten wir so nicht sehen. Die erste und dritte Zeile und die zweite und vierte Zeile sind identisch. Da sollte eine 2 stehen. Aus dem gleichen Grund funktioniert uniq &#8211;unique nicht, solange die Datei nicht sortiert vorliegt. In den meisten F\u00e4llen (XML, JSON etc) Dazeien w\u00fcrde die Sortierung die Datei unbrauchbar machen. Zur L\u00f6sung des Problems m\u00fcssen die Zeilen sortiert werden. sort consoleDup.log|uniq &#8211;count 1 Eine abweichende Zeile 2 &lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243; ?&gt; 2 &lt;Protokollzeile xxxyyyzzz &gt; Schon besser. Der uniq Parameter &#8211;repeated gibt nur die mehrfach vorkommenden Zeilen aus: sort consoleDup.log|uniq &#8211;count &#8211;repeated 2 &lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243; ?&gt; 2 &lt;Protokollzeile xxxyyyzzz &gt; Doppelt oder noch h\u00e4ufiger vorkommende Zeilen in Textdaten k\u00f6nnen schnell und elegant mit awk entfernt werden: awk &#8216;!seen[$0]++&#8217; consoleDup.log >> console_noDupRecords.log cat console_noDupRecords.log &lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243; ?&gt; &lt;Protokollzeile xxxyyyzzz &gt; Eine L\u00f6sung f\u00fcr die Powershell zeige ich hier.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[37,18],"tags":[42,46,73,88,91,103,104],"class_list":["post-311","post","type-post","status-publish","format-standard","hentry","category-korn-shell","category-shell-scripting","tag-awk","tag-bash","tag-linux","tag-shell","tag-sort","tag-uniq","tag-unix"],"_links":{"self":[{"href":"https:\/\/techno.slomka.biz\/index.php?rest_route=\/wp\/v2\/posts\/311","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/techno.slomka.biz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/techno.slomka.biz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/techno.slomka.biz\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/techno.slomka.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=311"}],"version-history":[{"count":0,"href":"https:\/\/techno.slomka.biz\/index.php?rest_route=\/wp\/v2\/posts\/311\/revisions"}],"wp:attachment":[{"href":"https:\/\/techno.slomka.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=311"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/techno.slomka.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=311"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/techno.slomka.biz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}