सवाल मेरे आदेश के साथ मेरी मदद करें (मुख्य रूप से awk)


मैंने अभी तक लिखा है कि सबसे अधिक contorted कमांड लिखा है और मैं जानना चाहता हूँ कि मैं इसे कैसे बेहतर बना सकता हूं।

मैंने यह लिखा:

grep -E '00[7-9]\.|0[1-9][0-9]\.' filename.log | awk '{print $6}' | sed 's/\(.*\):.*/\1/' | sort | uniq -c | sort -rn

एक उदाहरण इनपुट:

2011/06/30 07:59:43:81 20626 code_file.c (252): FunctionName: 009.63 seconds

असल में यह एक लॉग फ़ाइल के माध्यम से जा रहा है जो निष्पादित करने के लिए 7 और 99 सेकंड के बीच लिया गया उनमें से किसी भी को निष्पादित करने और पकड़ने के लिए कमांड की संख्या सूचीबद्ध करता है। फिर अजीब छठी शब्द छाप रहा है, जो एक कॉलन के बाद समारोह का नाम है। फिर sed कोलन और किसी भी पीछे की सफेद जगह को हटा रहा है, फिर इसे गिनती, गिनती, और उसके बाद इसकी गणना के आधार पर क्रमबद्ध किया जा रहा है।

मैं एचपी-यूएक्स पर हूं इसलिए मेरे कुछ उपकरण सीमित हैं, लेकिन मुझे पता है कि अजीब ऐसा कर सकता है जो मैंने अभी किया है। क्या कोई मेरी कमांड को जटिल करने में मेरी मदद कर सकता है?


2
2018-06-30 20:41


मूल


एक उदाहरण इनपुट लाइन सहायक होगी। - grawity
आपने बताया है कि आपके उपकरण सीमित हैं, क्या आप विस्तृत कर सकते हैं? उदाहरण के लिए, चूंकि गुरुत्वाकर्षण का जवाब perl में है, क्या आपके पास perl है? - bbaja42
क्या ओएस नहीं है पर्ल है? - grawity
मेरे पास पर्ल है मैं बस यह कह रहा हूं कि एचपी-यूएक्स उपकरण में अक्सर उनके जीएनयू काउंटर हिस्से की तुलना में कम कार्यक्षमता होती है। उदाहरण के लिए, एचपी-यूएक्स grep की कमी है -आरएबी और कई और आवश्यक विकल्प, uniq कमी -w, आदि - Malfist


जवाब:


awk '/00[7-9]\.|0[1-9][0-9]\./ { # for lines matching the regex
       split($6, c, /:/)         # take the part of field 6 before the colon
       cs[ c[1] ]++              # and increment the counter for that string
     }
     END {                       # after all lines have been read
       for (c in cs) {           # step through the counters
         print cs[c], c          # and output the count followed by the string
                                 #   ("," adds a space automatically)
       }
     }' filename.log | sort -rn  # standard awk doesn't support sorting, sadly

मैं उन लोगों की संख्या पर चकित रहना जारी रखता हूं जो स्पष्ट रूप से विश्वास करते हैं कि न तो awk न sed पैटर्न मिलान कर सकते हैं, इसलिए उन्हें एक जोड़ना होगा grep मंगलाचरण।


3
2018-06-30 22:11



क्या आप इसे तोड़ने की परवाह करते हैं? मैं पूरी तरह समझ नहीं पा रहा हूं कि आप क्या कर रहे हैं। - Malfist
पहला चरण: किसी भी रेखा पर जो रेगेक्स से मेल खाता है, कोलन पर फ़ील्ड 6 विभाजित करता है और पहले घटक के आधार पर एक काउंटर बढ़ाता है (यह आपके डुप्लिकेट करता है sed)। (awkसरणी सामान्य सरणी की तुलना में पर्ल हैश या पायथन डिक्ट्स की तरह अधिक होती हैं।) दूसरी पंक्तियों को पढ़ने के बाद दूसरा स्टांजा निष्पादित होता है, और वस्तुओं को प्रिंट करता है और सरणी में गिना जाता है; यह बदल देता है sort | uniq -c अंश। मैं लाइनों को विभाजित कर सकता हूं और कुछ टिप्पणियां जोड़ सकता हूं। - geekosaur


मैं हूँ इसलिए इसके लिए नीचे जाने जा रहा है ...

#!/usr/bin/env perl
use strict;

my %counts;
while (my $line = <>) {
    my @line = split(/\s+/, $line);
    if ($line[6] >= 7) {
        $line[5] =~ /(.+):/ and $counts{$1}++;
    }
}

my @sorted = sort {$counts{$b} <=> $counts{$a}} keys %counts;

printf("%7d\t%s\n", $counts{$_}, $_) for @sorted;

1
2018-06-30 21:06



यह शायद ही एक आदेश है? : p - BloodPhilia
@ ब्लडफिलिया: मैं आधे आदेशों का उपयोग करता हूं जो दैनिक रूप से दिखते हैं। (दूसरा आधा बैश और पायथन है।) मैं इसे एक के रूप में लिखा होगा perl -ne एक लाइनर, लेकिन तुलना में, यह समझने के लिए असंभव के बगल में होगा। - grawity
पर्ल सुपरयूसर हो सकता है jQuery। ;-) - Patches


आपका आदेश थोड़ा भंगुर है क्योंकि अगर फ़ाइल नाम में एक जगह है तो यह असफल हो जाएगी। अन्यथा, आपका आदेश वास्तव में बहुत बुरा नहीं है। यह कुछ हद तक स्वाद का मामला है, लेकिन मुझे एक साधारण कमांड की तुलना में सरल पाइप कमांडों की एक श्रृंखला मिलती है, जैसे किसी बड़े कमांड को पोस्ट किया जाता है। यह लगभग एक कार्यात्मक शैली में प्रोग्रामिंग की संभावना है।

हालांकि, आप अजीब और sed को खत्म करने के लिए grep बदल सकते हैं, लेकिन अब regex समझने के लिए बहुत कठिन है:


grep -P -o '(?<=\): ).+?(?=: 00[7-9]|0[1-9]|1)' | sort | uniq -c | sort -nr

रेगेक्स को समझाने के लिए, हम पर्ल स्टाइल रे (-पी परम) का उपयोग करते हैं और मैच को ठीक से फ़ंक्शन नाम से अलग करने के लिए (? <=) और लुक-आगे (? =) का उपयोग करते हैं। ध्यान दें कि लुक-बैक और लुक-आगे शून्य-चौड़ाई है, जिसका अर्थ है कि उन्हें मैच का हिस्सा नहीं माना जाता है, लेकिन यह नियंत्रित करता है कि मैच वास्तव में क्या होगा। चूंकि मैच अब फ़ंक्शन नाम है, इसलिए हम grep को पूरी लाइन की बजाय मिलान करने वाली स्ट्रिंग को मुद्रित करने के लिए कह सकते हैं। मुझे लगता है कि आपको जो कुछ भी है, उसे छोड़ देना चाहिए, जब तक आपको लगता है कि रिक्त स्थान के साथ फ़ाइल नाम एक संभावना नहीं है।


1
2017-07-01 02:11





जबकि मैं इसमें हूं:

#!/bin/sh
grep -E '00[7-9]\.|0[1-9][0-9]\.' "$@" | awk '{print $6}' |
    sed 's/:$//' | sort | uniq -c | sort -rn

मूल आदेश जटिल नहीं है, यह प्रत्येक लॉग के लिए पुनरावृत्ति है जो इसे दिखता है। इसे एक स्क्रिप्ट फ़ाइल (या एक फ़ंक्शन) में चिपकाएं, इसे कॉल करें sortbytime, और वहां - आपके पास एक साधारण एक-शब्द कमांड है।


0
2018-06-30 22:17



क्या कोई कारण है कि इसे अलग जवाब होना चाहिए? - nhinkle♦
@ एनंकल: शायद नहीं। इसे हटाने के लिए स्वतंत्र महसूस करें। (मुझे उन्हें मर्ज करना चाहिए, लेकिन फोन के ब्राउज़र का उपयोग करके ऐसा नहीं कर सकता।) - grawity
दो अलग-अलग उत्तर हैं। अगर किसी ने इसे पसंद किया और दूसरे को पसंद नहीं किया तो वे इस तरह वोट दे सकते हैं। अगर वे विलय हो गए, तो वे नहीं कर सके। यह सब कुछ या कुछ भी नहीं होगा। - Malfist