在bash脚本中的grep命令中转义空格

时间:2017-01-18 12:21:55

标签: bash grep

我试图在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脚本中得到了错误的结果。

真的很困惑。

1 个答案:

答案 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

我认为这就是你想要的。