몇 가지 조건을 수행했지만 파일에서 3개 이상의 조건을 확인하기 위한 정확한 구문을 얻을 수 없습니다.
파일에서 여러 grep을 수행할 수 있지만 조건이 있는 3가지 패턴을 추가할 수는 없습니다. 아래와 같습니다.
CASE/Loop/if-else(사다리 구문)를 제공할 수 있습니다. 저는 단지 사용자가 이 스크립트를 실행할 때 사용자에게 친숙한 메시지를 인쇄하고 싶을 뿐입니다. start.log 파일에 있는 패턴 대신에 이러한 사용자 친화적인 메시지는 Startup.log에서 어떤 패턴이 발견되는지에 따라 달라집니다.
내가 start.log에서 위 명령을 실행할 때 pid가 이미 존재한다는 것을 발견하고 다음과 같이 echo "DB services 이미 실행 중"을 인쇄하고 싶다고 가정해 보겠습니다.
pg_ctl -D $PGDATA start > startup.log
if [$? -eq 0]
then
#if db services is stopped priviously, then it will start and grep below msg to user
ls -t postgresql*.log | head -n1 | args grep "Database for read only connections"
else
elif grep 'word1\|word2\|word3' startup.log
then
#if above word1 exists in file it should print below msg
echo "hello"
else
#if word2 is present in file it shhould print below msg
echo " world"
# and one more contion i want to add like below
#if word3 is exists in the file it should below msg
echo "postgresql"
구문을 시도했지만 이해할 수 없었기 때문에 간단한 예 1개를 제공해 주시면 정말 감사하겠습니다.
답변1
문제에 대한 설명을 기반으로 파일에서 다른 패턴이 발견되면 다른 작업을 수행하려고 합니다. 이를 위해서는 다양한 확인이 필요합니다.
if grep -q word1 startup.log; then
echo "Message 1"
elif grep -q word2 startup.log; then
echo "Message 2"
elif grep -q word3 startup.log; then
echo "Message 3"
else
echo "Message 4"
fi
grep -q
파일이 일치하는지 자동으로 확인합니다. 일치하는 각 패턴에 대해 표시할 해당 메시지를 추가할 수 있습니다.
위의 논리는 단일 메시지만 표시합니다. 파일에 여러 패턴이 있는 경우 if-elif 체인의 이전에 지정된 패턴이 우선합니다.
각 패턴을 독립적으로 확인하려면 별도의 if
블록을 사용할 수 있습니다.
if grep -q word1 startup.log; then
echo "Message 1"
fi
if grep -q word2 startup.log; then
echo "Message 2"
fi
답변2
파일에서 여러 패턴이 발견되거나 패턴의 여러 인스턴스가 발견된 경우 수행할 작업을 설명하지 않았습니다. 다음 쉘 코드는 발견된 경우 일부/모두를 처리하기 위해 루프로 작성되었습니다.
for word in $(grep -oE "word1|word2|word3" startup.log ); do
case "$word" in
word1) echo "hello" ;;
word2) echo "world" ;;
word3) echo "postgresql" ;;
esac
done
그렙 옵션:
-E
word1|word2
확장 정규식 사용( 대신 사용할 수 있음word1\|word2
)-o
산출오직전체 줄이 아닌 줄의 일치하는 부분(예: word1, word2 또는 word3)