Bash 파일 내의 명령에서 변수를 사용하는 방법

Bash 파일 내의 명령에서 변수를 사용하는 방법

나는 Redhat Linux 서버 8.8에서 이 명령을 직접 사용하고 있으며 잘 작동하며 원하는 결과를 얻습니다.

grep '01-FEB-2024' /u01/app/server1/listener_scan/trace/listener_scan.log | awk '{ if ( $NF != 0 ) print $0 }'

Bash 파일을 사용하여 이 프로세스를 자동화해야 하는데 current_date 변수의 값을 가져오지 못하는 것 같습니다.

#!/bin/bash
current_date=$(date "+%d-%b-%Y")
grep '$current_date' /u01/app/server1/listener_scan/trace/listener_scan.log | awk '{ if ( $NF != 0 ) print $0 }' >> y.out
grep "$current_date" /u01/app/server1/listener_scan/trace/listener_scan.log | awk '{ if ( $NF != 0 ) print $0 }' >> y.out
grep $current_date /u01/app/server1/listener_scan/trace/listener_scan.log | awk '{ if ( $NF != 0 ) print $0 }' >> y.out

이 모든 경우에는 null을 반환합니다. 미리 감사드립니다.

답변1

date +%d-%b-%Y날짜를 0부터 길이 2까지 패딩하고, 연도를 0부터 4자리까지 패딩하여 현재 날짜를 출력합니다.

명령을 실행하는 사람에 따라 다음과 유사한 결과를 얻을 수 있습니다.

06-فبر-2024
06-лют-2024
06-fév-2024

C/POSIX 로케일에서는 다음을 얻습니다.

$ LC_ALL=C date +%d-%b-%Y
06-Feb-2024

로그에 동일한 내용이 포함되어 있지만 대문자인 것 같습니다.

여기에서 다음을 수행할 수 있습니다.

#! /bin/sh -
TODAY=$(LC_ALL=C date +%d-%b-%Y) exec awk '
  BEGIN{today = toupper(ENVIRON["TODAY"])}
  index($0, today) && $NF != 0
  ' /u01/app/server1/listener_scan/trace/listener_scan.log

mawk, busybox는 이 정보를 자체적으로 얻을 awk수 있으므로 gawkLinux 기반 시스템에서도 작동할 가능성이 높습니다.

#! /bin/sh -
LC_ALL=C exec awk '
  BEGIN {today = toupper(strftime("%d-%b-%F"))}
  index($0, today) && $NF != 0
  ' /u01/app/server1/listener_scan/trace/listener_scan.log

(이는 로그 파일 내용이 텍스트로 디코딩되는 방식에도 영향을 주지만 아마도 최선일 것입니다. 이는 오류 메시지의 언어에도 영향을 미칩니다.)

답변2

나는 무엇을 할 것인가:

#!/bin/bash

current_date=$(date "+%d-%b-%Y")
grep -i "$current_date" /u01/app/server1/listener_scan/trace/listener_scan.log |
    awk '{ if ( $NF != 0 ) print $0 }' >> y.out

쉘에서 올바르게 인용하는 방법을 배우는 것은 매우 중요합니다.

공백/메타 문자를 포함하는 모든 리터럴은 "큰따옴표"로 처리합니다.모든확장: "$var", "$(command "$var")", "${array[@]}", "a & b". 'single quotes'코드나 텍스트 $'s: 'Costs $5 US'에 대해서는 ssh host 'echo "$HOSTNAME"'을 참조하십시오.
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
https://web.archive.org/web/20230224010517/https://wiki.bash-hackers.org/syntax/words
언제 큰따옴표가 필요합니까?

답변3

명령이 반환하는 06-FEB-2024주석에 언급된 대로 와 같은 패턴을 일치시켜야 합니다 .date06-Feb-2024

변수를 대문자로 표시할 수 있습니다.

current_date=$(LC_ALL=C date "+%d-%b-%Y")
grep "${current_date^^}" /u01/app/server1/listener_scan/trace/listener_scan.log |
    awk '{ if ( $NF != 0 ) print $0 }' >> y.out

다음과 같이 조합을 결합할 수도 있습니다.

awk -v date="$(LC_ALL=C date +'%d-%b-%Y')" '$0 ~ toupper(date) && $NF!=0' /u01/app/server1/listener_scan/trace/listener_scan.log >>y.out

관련 정보