문자열과 일치하는 파일의 마지막 줄을 찾으시겠습니까? [폐쇄]

문자열과 일치하는 파일의 마지막 줄을 찾으시겠습니까? [폐쇄]

파일에서 무한히 실행되는 루프를 원하지만 항상 마지막 줄에 일치하는 문자열이 포함되어 있는지 확인하고, 일치하는 문자열이 있으면 해당 줄을 에코하고 루프를 계속 실행합니다. 지금 가지고 있는 것이 작동하지 않습니다. grep 오류가 발생합니다.

#! /bin/bash

echo "Script is starting......."
FILE="/Users/shubhamsinha/Desktop/new_test.log"
# (tail -n1) < FILE
STRING="MYNAME"
while : ;do
    Last = tail -F "$FILE"
    grep -q "$STRING" "$Last" && echo "FOUND" && break
    sleep 5
done

답변1

스크립트 작성을 귀찮게 하지 마세요. 이를 위해서는 스크립트가 아닌 줄이 필요합니다.

새로운 도구를 작성하는 대신 기존 도구를 활용하여 필요한 작업을 수행하세요.

명령줄에 다음을 입력하면 됩니다.

tail -f -n 1 /Users/shubhamsinha/Desktop/new_test.log | grep MYNAME

설명하다:

tail -f지정된 파일에서 영원히 실행되고 파일에 추가된 각 추가 줄을 출력합니다.

-n 1즉, tail시작 시 파일의 기본 마지막 10줄 대신 현재 파일의 마지막 줄만 출력됩니다.

|파이프라인이다. 파이프를 이해하지 못한다면 모든 것을 버리고 파이프를 이해할 때까지 더 많은 쉘 스크립트를 작성하지 마십시오. (오래 걸리지는 않겠지만비판적인좋은 스크립트를 작성하세요. )

grep MYNAME입력에 MYNAME 패턴이 포함된 행만 인쇄합니다.

답변2

#! /bin/bash
echo "Script is starting......."
FILE="/Users/shubhamsinha/Desktop/new_test.log"

STRING="MYNAME"

while true; do
    tail bar | grep "MYNAME" && echo "FOUND" && break
    sleep 5
done

  • FILE="/home/user1/tmp/bar"
  • 스크립트 이름은foo

    % ./foo &                  
    [1] 12586
    Script is starting.......                                                                                                                                                                                                               
    % echo "MYNAME" > ~/tmp/bar
    % MYNAME
    FOUND
    
    [1]  + 12586 done       ./foo
    

답변3

tail해당 명령을 사용하는 대신 awk완벽한 출력을 얻으려면 사용하십시오.

Last = tail -F "$FILE"  ===>  Last=$(awk '/./{line=$0} END{print line}' $FILE)

관련 정보