我试图在bash脚本中尝试这样一个简单的grep,
grep "2017/01/01 00:" log.txt | wc -l
工作正常。
在我的bash脚本中,我试图这样做,
i=16
DATE="$(date -d $2' '$i:00:00 '+%Y/%m/%d %H')"
echo $DATE
COUNT="$(grep $DATE $1 | wc -l)"
echo $COUNT
我称之为,
test.sh log.txt 2017/01/01
因为空间而失败,带有
: No such file or directory
所以我尝试添加双引号,单引号和许多其他内容,但它们都失败了......
COUNT="$(grep \"$DATE\" $1 | wc -l)"
我也尝试过使用printf,虽然看起来很有希望,但
printf -v COMMAND "grep \"$DATE"
echo $COMMAND
# outputs: grep "2016/05/25 16
这个人用字符串的开头弄乱了!
printf -v COMMAND "grep \"$DATE\""
echo $COMMAND
# outputs: "rep "2016/05/25 16
" g"发生了什么? 我怎么能逃离那个空间?我也尝试用\ s代替它,它在命令行中运行,但是从bash脚本中得到了错误的结果。
真的很困惑。
答案 0 :(得分:2)
这可能是一个终结问题(!)。我在Cygwin上测试了你的脚本,使用vi作为编辑器。使用Windows行结尾(\r\n
),来自:set ff=dos
,我得到了
2017/01/01 16
: No such file or directory
但是当我将行结尾更改为Unix(\n
)时,使用:set ff=unix
,我得到了
2017/01/01 16
grep: 16: No such file or directory
这是不一样的错误信息!除此之外,您还需要更多quoting:
#!/bin/bash
i=16
DATE="$(date -d "$2 $i:00:00" '+%Y/%m/%d %H')"
# Double-quote ^^^^^^^^^^^^^ the whole argument rather than using ' '
echo $DATE
COUNT="$(grep "$DATE" "$1" | wc -l)"
# Double-quote^ ^ ^ ^ each individual variable you use
echo $COUNT
使用
的测试文件2017/01/01 16:15:00 flarp
2017/01/02 16:15:00 quux
2017/01/01 15:15:00 moby
我得到了输出:
2017/01/01 16
1
我认为这就是你想要的。