如何在 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

在所有这些情况下,它都会返回空值。先感谢您。

答案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、busyboxawk可以gawk自己获取这些信息,因此在基于 Linux 的系统上这也很可能有效:

#! /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

学习如何在shell中正确引用,这非常重要:

“双引号”包含空格/元字符的每个文字以及每一个扩张:"$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,但正如注释中所述,该date命令返回06-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

相关内容