2017-01-18 1 views
1

Ich versuche, ein einfaches grep wie dies in einem Bash-SkriptFlucht in einem Bash-Skript, um einen Raum in einem Befehl grep

, zu tun
grep "2017/01/01 00:" log.txt | wc -l 

Das funktioniert gut.

In meinem Bash-Skript, das, ich versuche

i=16 
DATE="$(date -d $2' '$i:00:00 '+%Y/%m/%d %H')" 
echo $DATE 
COUNT="$(grep $DATE $1 | wc -l)" 
echo $COUNT 

zu tun und ich es so nennen,

test.sh log.txt 2017/01/01 

, dass wegen des Raumes nicht mit einem

: No such file or directory 

Also habe ich versucht, doppelte Anführungszeichen, einfache Anführungszeichen und viele andere Dinge, aber sie alle fehlschlagen ...

COUNT="$(grep \"$DATE\" $1 | wc -l)" 

Ich habe auch versucht printf verwenden, und obwohl dies sieht vielversprechend aus,

printf -v COMMAND "grep \"$DATE" 
echo $COMMAND 
# outputs: grep "2016/05/25 16 

dieses verwirrt mit dem Anfang der Zeichenfolge up!

printf -v COMMAND "grep \"$DATE\"" 
echo $COMMAND 
# outputs: "rep "2016/05/25 16 

Was ist mit dem "g" passiert ?? Wie kann ich diesem Raum entkommen? Ich habe auch versucht, es durch \ s zu ersetzen, was in der Befehlszeile funktioniert, aber falsche Ergebnisse aus dem Bash-Skript ergibt.

Wirklich verwirrt.

Antwort

2

Es ist wahrscheinlich ein Zeilenende-Problem (!). Ich habe dein Skript auf Cygwin getestet, mit vi als Editor. Mit Windows-Zeilenenden (\r\n), von :set ff=dos, erhalte ich

2017/01/01 16 
: No such file or directory 

Aber wenn ich die Zeilenende auf Unix ändern (\n), mit :set ff=unix, bekomme ich

2017/01/01 16 
grep: 16: No such file or directory 

, die nicht das gleiche ist Fehlermeldung! Other than that, müssen Sie nur ein bisschen mehr 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 

Mit einer Testdatei von

2017/01/01 16:15:00 flarp 
2017/01/02 16:15:00 quux 
2017/01/01 15:15:00 moby 

bekomme ich die Ausgabe:

2017/01/01 16 
1 

, die ich denke, ist, was Sie wollen .

+0

Danke! Ich habe Cygwin benutzt, ja! Ich ändere die Zeilenenden der Datei nur auf LF und jetzt bekomme ich einige Ergebnisse mit deinem Code zurück. Allerdings bekomme ich andere Zahlen (weniger Einträge) im Vergleich, wenn ich das Grep direkt von der Kommandozeile aus ausführen ... Es scheint, dass es ein anderes Muster entspricht :( – endavid

+0

Nevermind. Statt COUNT = "$ (grep ...)" direkt habe ich eine Funktion aufgerufen, die das Gleiche gemacht hat und $ COUNT zurückgegeben hat und sie mit countOccurrences $ 1 "$ DATE" aufgerufen hat (die Anführungszeichen, also wurde das Leerzeichen übergeben.) Das gibt mir weniger Vorkommnisse als den Grep direkt anzurufen ... I habe den Funktionsaufruf entfernt und ich mache es jetzt direkt. – endavid