用管道将cat/grep/参数导入bash脚本中的变量中


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

从命令行运行,以上操作将产生预期的输出。

首先——因为您没有在展开中加引号,所以它们作为单独的参数传递给grep。字符串拆分和globbing的第一个结果$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

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

最新更新