我直接在我们的 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