tail 및 awk를 사용하여 로그를 모니터링하고 명령을 실행할 때 문제가 발생합니다.

tail 및 awk를 사용하여 로그를 모니터링하고 명령을 실행할 때 문제가 발생합니다.

로그 파일을 실시간으로 모니터링하고, 로그에 특정 문장이 나타날 때 특정 명령을 실행하고 싶습니다.

나는 이 사이트(그리고 다른 많은 사이트)를 검색했고 다음은 내가 시도한 것입니다:

tail -f /var/log/omxlog | awk '/player_new/ { "echo hello" }'

또는

stdbuf -o0 tail -F /var/log/omxlog | awk '/player_new/ { "echo hello" }'

그러나 그들은 작동하지 않습니다. 이 명령을 실행할 때마다 대기가 시작되지만 로그 파일이 변경된 것은 확실하지만 echo hello는 인쇄되지 않습니다. 실제로는 아무 작업도 수행되지 않습니다. 기다리고 있어요 :D

그래서 내가 무엇을해야하니! ?

(시스템: Raspberry Pi. 운영 체제: Raspbian)

답변1

Archemar는 답변에서 정확한 문제에 대한 올바른 솔루션을 제공합니다.

그러나 분명히 "echo hello"를 사용하므로 bash에서처럼 일반 명령을 실행하고 싶을 것입니다.

이 경우 bash에 머무르면 (awk에서 수행하는 방법을 배우지 않고) bash의 전체 기능을 사용할 수 있습니다. 이것이 더 유연하고 작업하기 쉽다는 것을 알게 될 것입니다... .

bash 방법, 한 줄:

tail .... | while read ; do [[ "{REPLY}" =~ player_new ]] && echo hello ; done

다음을 수행할 수 있습니다.

#!/bin/bash

tail_log()
{
    tail -f "${1}"
    # or use stdbuf here instead
}

do_player_new()
{
  local log_line="${1}"
  echo "hello"
}

do_something_else()
{
  local log_line="${1}"
  echo "example: line was ${1}"
}

process_match()
{
  local full_line="${1}"

  case "${BASH_REMATCH[1]}"  #this bash_rematch array holds the part of the line that matched the () in the pattern 
  in
    player_new)      do_player_new "${full_line}";;
    something_else)  do_something_else "${full_line}";;
    another_example) do_another_example "${full_line}";;
  esac

  #or you could actually just execute this:
  # "do_${BASH_REMATCH[1]}" "${full_line}"
}

process_log()
{
  local logfile="${1}"
  local matcher="${2}"

  tail_log "${logfile}" | while read line
  do 
    # this checks the line against the regular expression
    # and the result of the match (parts between ()) will
    # be stored in the BASH_REMATCH array
    [[ "${line}" =~ ${matcher} ]] && process_match "${line}"
  done
}

process_log /var/log/omxlog '(player_new|something_else)' &

process_log /some/other/log '(another_example)' &

내 Android 휴대폰에서 테스트를 실행하기 위한 예제 텍스트

$> while sleep 5 ; do echo player_new >> test.txt ; done &
[2] 3110
$> tail -f test.txt | while read ; do [[ "${REPLY}" =~ player_new ]] && echo $(date) hello; done
Wed Feb 15 01:39:12 ACDT 2017 hello
Wed Feb 15 01:39:12 ACDT 2017 hello
Wed Feb 15 01:39:12 ACDT 2017 hello
Wed Feb 15 01:39:15 ACDT 2017 hello
Wed Feb 15 01:39:20 ACDT 2017 hello
^C
$>

이 기능은 내 휴대전화에서 작동하므로 작동하지 않는 이유는 Raspberry Pi와 관련이 있을 수 있으며 이에 대해 제가 할 수 있는 일은 없습니다. 죄송합니다.

답변2

awk에서 명령문을 인쇄하려면 print를 사용하십시오. 자세한 내용은 다음을 참조하세요.해결책.

문자열 player_new를 일치시키려면 다음을 사용하십시오.

awk '$1 ~ /player_new/ {print $1}' /var/log/omxlog

지속적인 모니터링:

tail -f /var/log/omxlog | awk '$1 ~ /player_new/ {print $1}'

이것보다 더여기.

관련 정보