将cat / grep / arguments传递到bash脚本中的变量中

时间:2019-02-13 03:19:27

标签: bash grep pipe cat

#!/bin/bash
DATE=`date +%Y-%m-%d`
HOUR=`date +%H`
ORDERS_THIS_HOUR=`cat cli.log | grep $DATE $HOUR | grep -o "generated for Production" | wc -l`
OUTPUT="$DATE $HOUR : $ORDERS_THIS_HOUR"

echo "$OUTPUT" >> flow_productivity.log

问题在第二行:grep: 14: No such file or directory

这是一个示例命令,我想将其结果存储在$ORDERS_THIS_HOUR中:

cat cli.log | grep "2019-02-13 12" | grep -o "generated for Production" | wc -l

从命令行运行,上面的命令会产生预期的输出。

2 个答案:

答案 0 :(得分:1)

它以$HOUR作为文件名。使其grep "$DATE $HOUR"

答案 1 :(得分:1)

首先-因为您没有在扩展名两边加引号,所以它们被作为单独的参数传递给grep。字符串拆分和$DATE $HOUR的第一个结果成为grep搜索的文件名,随后的结果成为要搜索的文件名。

除此之外,无论如何在同一脚本中多次调用date是一个坏主意。如果您的脚本随着时间的流逝而运行,该怎么办?您可以将第一个呼叫date的时间设为一天的结束,而第二个则返回第二天早上的开始。为避免这种风险,请仅致电date,如下所示:

now=$(date '+%Y-%m-%d %H')
msg="generated for Production"
orders_this_hour=$(grep -Ec "($now.*$msg|$msg.*$now)" <cli.log)
output="$now : $orders_this_hour"
echo "$output" >> flow_productivity.log