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 시간을 로컬 타임스탬프로 변환하고, 한 줄당 시간을 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 시간을 가져오도록 변경되었습니다. localtime)gmtime

어떤 경우 에라도텍스트를 처리하기 위해 쉘 루프를 사용해서는 안됩니다.

답변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."

관련 정보