2

ログファイルを解析し、各行の特定の部分の重複する一致を見つけるスクリプトを作成しようとしています。重複が存在する場合は、重複に一致する最初の行でスクリプトを実行する必要があります。私のログの詳細は次のとおりです。

#: 177          101 User 1 Channel: SIP/101
#: 178          117 User 2 Channel: SIP/117
#: 179          150 User 3 Channel: SIP/150
#: 356          166 User 4 Channel: SIP/166
#: 387          117 User 2 Channel: SIP/117

ログファイルのSIP/部分に基づいて重複を見つけたいのですが、ログファイルの#部分に基づいてスクリプトを実行する必要があります。このログに基づいて、#:178行のスクリプトを実行する必要があります。

これまで使用してきました

egrep -o ".{50}SIP.{4}"

回線のSIP/セクションに基づいて重複を検索します。次に、行全体を取得して#:178を取得し、実行するスクリプトを生成する方法がわかりません。

4

4 に答える 4

1

を使用する 1 つの方法を次に示しGNU awkます。

awk '$NF in array && !dup[$NF] { print array[$NF]; dup[$NF]++ } { array[$NF]=$2 }' file.txt

結果:

178
于 2012-10-05T21:32:18.370 に答える
1

ワンパスソリューション。uniqスキップフィールドと繰り返しのみのフラグのサポートを利用します

sed -n '/SIP/{s/^#:\s\+\([0-9]\+\).*SIP\/\([0-9]\+\)/\1 \2/;p}' file.txt | sort -k2,2 -n | uniq -f 1 -d | cut -f1 -d ' '
于 2012-10-05T21:47:56.140 に答える
0

AWK は、この種の作業に適しています。

これは、読み取り可能なワンパス ソリューションです。

#!/usr/bin/env awk -f

{
    sip = $3
    script = $2

    count[sip]++

    if (count[sip] == 1) {
        scripts[sip] = script
    }
    else if (count[sip] > 1) {
        to_run[sip] = scripts[sip]
    }
}

END {
    for (sip in to_run) {
        print to_run[sip]
    }
}
于 2012-10-05T21:59:50.030 に答える
0

これを行う1つの方法:

grep -nE "$(sed -ne '/^#/s/.*SIP\/\([0-9]*\)$/\1/p' log.txt | sort -n | uniq -d | paste -sd '|')"  log.txt | head -n 1

これは(あなたのサンプルファイルに基づいて)印刷されます:

2:#: 178          117 User 2 Channel: SIP/117

主なコマンドは、grep -nE "$(...)" log.txtログ ファイルで繰り返し行を検索して出力します (この正規表現は動的に生成されます。以下で説明します)。次に、出力が にパイプさhead -n 1れて、最初の行だけが印刷されます。コマンドへの-nフラグgrepは、一致した実際の行番号を出力します。必要ない場合は削除できます。

正規表現を生成するには、4 つのコマンドがあります。

  1. sed -ne '/^#/s/.*SIP\/\([0-9]*\)$/\1/p' log.txt、 で始まる回線に存在する SIP 番号だけを抽出し#ます。
  2. sed の出力 (数値のリスト) はパイプ処理され、数値順に並べ替えられます。
  3. ソート後、コマンドを使用してuniq -d重複行のみを出力できます。
  4. paste最後に、コマンドを使用してすべての数字を 1 行に結合します。-d '|'オプションを使用して、OR の正規表現演算子である「|」で数字を区切ることを指定します。

したがって、正規表現は、重複する番号のいずれかを持つ行を見つけます。

これが役立つことを願っています=)

于 2012-10-05T21:31:24.440 に答える