stdinのwhileループ

stdinのwhileループ

私の使命は、次のことです。

標準入力(おそらくファイルかもしれませんが、正確には何であるかわかりません)でこれを処理して、次のことを再現します。

2021-07-06 - 12:45:12 - 218.251.25.78 - "Through bag smile international talk."
2021-07-06 - 12:45:12 - 213.255.42.89 - "Lay point red away member network."
   ^^^         ^^^         ^^^                      ^^^
   date    hour(init)      ip                   description

これは標準入力によって提供される情報です。

Init: 2021-07-06 12:45:12
End: 2021-07-06 13:38:09
Logfile:
1625561998 218.251.25.78 CRITICAL "Through bag smile international talk."
1625573490 223.203.248.97 ERROR "Evening message suffer certainly pretty nothing she."
1625560753 36.254.92.124 DEBUG "Future suddenly guy issue Congress feeling."
1625563857 213.255.42.89 CRITICAL "Lay point red away member network."
1625560959 107.150.127.36 DEBUG "Center nothing approach."
1625579950 54.56.188.207 DEBUG "Then final simple door sell."

CRITICALフラグを持つログのみをインポートする必要があります。

したがって、時間が経つにつれて行を読むことは効果があると仮定していますが、情報を把握して部分的な情報を取得してから、すべてを接続する方法がわかりません。他のプログラミング言語では簡単になるかもしれませんが、Bashでは何をすべきかわかりません。

** Bashを使って管理したので編集しました。問題は単語を検索しているので、その単語が$ 3フィールドだけでなく他の場所にある場合は一致しますが、これは不適切です。

#!/bin/bash

while read -r line
do
    if echo $line | grep -q "CRITICAL"; then
        epoch=$(echo $line | gawk '{$1 = strftime("%F %T", substr($1,1,10))} 1')
        hDateIp=$(echo $epoch | sed 's/CRITICAL//g' | cut -d ' ' -f1-4 | sed 's/\ /\ \-\ /g')
        msg=$(echo $epoch | cut -d '"' -f2)
        echo $hDateIp \"$msg\"
    fi
done < file-ingest

また、条件に次の行を含めようとしましたが、出力が奇妙なため成功しませんでした。

if echo $line | awk -F '[]' '$3 == "CRITICAL"'

答え1

変換したいとしましょう... Unix epoch時間をローカルタイムスタンプに変換し、1行あたりの時間を1625561998印刷する代わりに、次を使用します。Initperl

perl -MPOSIX -lne '
  print strftime("%F - %T - ", localtime$1), "$2 - $3"
    if /^(\d+) (\S+) CRITICAL (.*)/' <your-file
2021-07-06 - 09:59:58 - 218.251.25.78 - "Through bag smile international talk."
2021-07-06 - 10:30:57 - 213.255.42.89 - "Lay point red away member network."

(現地時間ではなくUTC時間を取得するように変更されました。localtimegmtime

いずれにせよテキストを処理するためにシェルループを使用しないでください

答え2

#! /bin/bash

read -r dummy date time rest
read -r ignore
read -r ignore

while read -r timestamp ip category text; do
        if [ "$category" = 'CRITICAL' ]; then
                printf '%s - %s - %s - %s\n' "$date" "$time" "$ip" "$text"
        fi
done

答え3

使用Perl(組み込みのみ、モジュールを取り付ける必要はありません):

私は改宗するUnix epoch timeあなたの質問に対する私たちの意見に従って、あなたが質問に割り当てた人が読むことができる形式は次のとおりです。

<INPUT> |
perl -MPOSIX -ane '
    CORE::say join " ", strftime("%F - %T -", localtime $F[0]), @F[1..$#F]
        if $F[0] =~ /^\d+$/ and $F[2] eq "CRITICAL"
'

2021-07-06 - 10:59:58 - 218.251.25.78 CRITICAL "Through bag smile international talk."
2021-07-06 - 11:30:57 - 213.255.42.89 CRITICAL "Lay point red away member network."

関連情報