web-dev-qa-db-ja.com

私のコマンドで私を助けてください(主にawk)

私は今までに書かれた最もゆったりとした命令を書いたばかりで、私はそれをどのように良くするかを知りたいです。

私はこれを書いた:

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秒の間に実行されるそれらのいずれかを実行して掴むコマンドを実行した秒数をリストするログファイルを実行します。その後、AWKは6つの単語を印刷しています。これは関数名とそれに続くコロンです。その後、SEDはコロンと末尾の空白を取り除いているので、それはそれがカウントに基づいて並べ替え、カウント、そしてその後ソートされます。

私はHP-UXにいます。誰かが私が私のコマンドを解読するのを助けますか?

2
Malfist

私はそうこのためにダウンボットにされるつもりです...

#!/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
user1686

ファイル名にスペースがある場合、コマンドは失敗するため、もう少し脆弱です。それ以外の場合は、あなたのコマンドは実際には悪すぎません。それは味の問題の問題ですが、私は1つの複雑なコマンドよりもはるかに簡単なパイプされたコマンドのチェーンがあります。機能的なスタイルでのプログラミングがほとんどありません。

しかし、あなたはawkとsedを排除するためにgrepを変更することができました、しかし今すぐ正規表現は理解するのははるかに難しいです:


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

正規表現を説明するには、PerlスタイルRE(-p param)を使用し、次に見てください(?<=)とLook-Hase(?=)を使用して、一致を正確に機能名に分離します。外観と先読みはz幅ゼロです。つまり、マッチの一部とは見なされず、一致が実際にどのようになるのかを制御します。一致は正確に機能名であるため、-oを使用してgrepを使用して、行全体ではなく一致文字列を印刷するだけです。スペースを持つファイル名が可能性があると思わない限り、私はあなたが持っているものを残すべきだと思います。

1
frankc

私はそれにいる間:

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

元のコマンドはそれほど複雑ではありません。それはそれを見せるすべてのログの繰り返しです。スクリプトファイル(または関数)に貼り付けて、sortbytimeを呼び出し、そこに - 単純な1ワードコマンドがあります。

0
user1686