Bashファイル内のコマンドで変数を使用する方法

Bashファイル内のコマンドで変数を使用する方法

私はRedhat Linux Server 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

関連情報