You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于在find与grep命令中使用变量的方法及脚本变量$Y失效问题的求助

在find与grep命令中使用变量的方法及脚本变量$Y失效问题的求助

嘿,我来帮你排查下这个问题!你的脚本里主要有几个小错误导致变量$Y没生效,还出现了文件找不到的报错,咱们一步步来修正:

首先,修正变量$Y的赋值方式:你原来写的Y=(date -d "1 day ago" "+%Y-%m-%d")是数组的赋值语法,这会导致$Y并没有被赋值成你想要的昨天日期字符串。正确的命令替换写法应该是用$()把date命令包起来,这样才能把命令的输出赋值给变量:

Y=$(date -d "1 day ago" "+%Y-%m-%d")

然后,修正find命令的-name参数:你原来的写法-name '*log_LOG_POSTPAID_CDR'*$Y*.log里,引号只包裹了模式的一部分,shell会把后面的*$Y*.log单独解析,可能导致$Y没有被正确替换,甚至出现匹配错误。应该把整个文件名匹配模式放在一对引号里,并且用${Y}来明确变量边界(避免和后面的字符混淆):

-name "*log_LOG_POSTPAID_CDR*${Y}*.log"

最后是最关键的grep用法错误:你原来的命令里,find输出文件路径后,又让grep去当前目录找log_LOG_POSTPAID_CDR*date*.log这类文件,但你的目标文件都在/log/bssuser/CDR/Postpaid_CDR_Log/目录下,当前目录根本没有这些文件,所以才会报错。正确的做法是把find找到的文件直接传给grep,这里有两种靠谱的方式:

方式一:用管道+ xargs(适合大部分场景)

Y=$(date -d "1 day ago" "+%Y-%m-%d")
find /log/bssuser/CDR/Postpaid_CDR_Log/ -type f -name "*log_LOG_POSTPAID_CDR*${Y}*.log" | xargs grep -H '^ORA'

方式二:用find的-exec选项(处理带空格的文件名更安全)

Y=$(date -d "1 day ago" "+%Y-%m-%d")
find /log/bssuser/CDR/Postpaid_CDR_Log/ -type f -name "*log_LOG_POSTPAID_CDR*${Y}*.log" -exec grep -H '^ORA' {} +

这两种方式都会让grep直接在find找到的目标文件里搜索以ORA开头的行,-H参数还会帮你显示对应的文件名,完全符合你的需求。

举个实际例子:如果$Y的值是2023-10-16,find会定位到像log_LOG_POSTPAID_CDR-2023-10-16_PTT_CDR.1066.20231010000509.csv_KODIAK-100.log这类文件,然后grep会在这些文件里提取你需要的行。

备注:内容来源于stack exchange,提问作者Amany Abd Elmnem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 11:13:05