我正在尝试运行for循环,如下所示
hour=`date +%H -d "1 Hour Ago"`
cd /Log1/
for i in `seq -w 00 "$hour"`; // $hour not working
do
zgrep -a "Packet" LOG1.txt| grep "#SUCCESS#" |wc -l >>success_chour.txt
zgrep -a "Packet" LOG2.txt| grep "#FAIL#" |wc -l >>fail_chour.txt
done
我已尝试$hour
,"$hour"
和'$hour'
但未成功。
答案 0 :(得分:2)
jiapingzjp @ jiapingzjp-Dell:〜$ cat my.sh
hour=`date +%H -d "1 Hour Ago"`
for i in `seq -w 00 "$hour"`;
do
echo $i
done
jiapingzjp @ jiapingzjp-Dell:〜$ bash my.sh
00 01 02 03 04 05 06 07 08 09 10 11 12
我认为代码没问题,我在ubuntu系统中尝试了"bash test.sh"
"dash test.sh"
,它运行正常。也许你可以显示你得到的错误信息以及你运行的命令。
答案 1 :(得分:0)
目前尚不清楚“没有成功”在这种情况下意味着什么,因为你甚至没有尝试在你的循环体内的任何地方展开$i
。
尽管如此,使用seq
实际上并不理想 - 它是一个非标准工具,没有内置到bash中。最好使用保证在shell所有地方都可用的功能:
# Calculate both day and hour at once
log_scan_end_time=$(date -d "1 hour ago" '+%Y-%M-%d-%H')
# ...then create log_scan_prefix by removing the hour
log_scan_prefix=${log_scan_end_time%-*}
# and extract the hour alone
max_hour=${log_scan_end_time##*-}
for ((cur_hour=0; cur_hour<max_hour; cur_hour++)); do
printf -v cur_hour_str '%02d' "$cur_hour" # generate a 0-padded string
logs=( Packet*"${log_scan_prefix}-${cur_hour_str}"*.gz )
[[ -e ${logs[0]} ]] || {
echo "No logs found matching pattern ${logs[0]}" >&2
continue
}
# print a header line in the output file to allow diagnosing results
for f in success_chour.txt fail_chour.txt; do
{
printf '# '
printf '%q ' "${logs[@]}"
printf '\n'
} >>"$f"
done
zgrep -E -a --count \
-e '(Packet.*#SUCCESS#)|(#SUCCESS#.*Packet)' \
-- /dev/null "${logs[@]}" >>success_chour.txt
zgrep -E -a --count \
-e '(Packet.*#FAIL#)|(#FAIL#.*Packet)' \
-- /dev/null "${logs[@]}" >>fail_chour.txt
done