2012-06-05 6 views
7

Ich versuche herauszufinden, wie oft eine Zeichenfolge in einer Datei wiederholt wird, gleichzeitig muss ich sie in einer Variablen speichern.Wie speichert man den Wert des cat-Befehls in der Variablen var?

Wenn ich den Befehl (cat filename | grep -c '123456789') verwende, wird die Zählung korrekt angezeigt, aber wenn ich den folgenden Befehl verwende, wird er als Befehl nicht gefunden angezeigt.

var =$(cat filename | grep -c '123456789') 
echo $var 

Können Sie mich wissen lassen, wo ich falsch liege?

+0

Haben Sie die einfachen Anführungszeichen benötigen um Ihre Suchbegriff für grep? – Levon

+0

@Levon, einfache Anführungszeichen um die Regex für Grep wäre nur erforderlich, wenn die Regex Zeichen enthält, die von der Shell interpretiert werden würden, wie '$' oder '[' oder ']'. Als eine sehr einfache Regex, die keine Sonderzeichen enthält, muss "123456789" nicht zitiert werden. – ghoti

Antwort

16

Sie keine Leerzeichen um das = Zeichen verwenden:

var=$(cat filename | grep -c '123456789') 

zumindest die Bash Prog Intro Howto

Lesen Sie haben aber eine nutzlose Verwendung von cat so Code einfach

var=$(grep -c '123456789' filename) 
0

bekam Mit Backquotes funktioniert auch:

varx=`(cat filename| grep -c '123456789')` 

Das heißt, die $ ist nicht erforderlich, Sie können die Ausgabe von verschiedenen Befehlen Variablen durch die Verwendung von Backquotes zuweisen.

Zum Beispiel:

$ pwd 
/home/user99 

$ cur_dir=`pwd` 
$ echo $cur_dir 
/home/user99 
+1

Das funktioniert, weil Sie das Leerzeichen vor dem '=' entfernt haben; du hättest die '$ (' ... ')' -Notation (besser lesbar und * nestbar *) anstelle der Backquotes beibehalten können –

+0

@ Levon: Ist es nicht notwendig, das $ -Symbol im obigen Befehl zu verwenden? –

+0

@JackieJames Nicht notwendig, der Befehl funktioniert wie gezeigt, Sie können stattdessen die Backquotes verwenden. Ich habe das sowohl mit bash als auch mit tcsh benutzt. Sind Sie dabei auf Probleme gestoßen? – Levon

6

dass grep Denken Sie daran, die Datei direkt lesen kann. Sie können vermeiden, useless use of cat.

Im Beispiel in Ihrer Frage, die Befehl tritt auf, weil der Raum nicht Fehler gefunden vor dem Gleichheitszeichen. Versuchen Sie stattdessen:

var=$(grep -c '123456789' filename) 

oder wenn Sie mit bash:

read var < <(grep -c '123456789' filename) 

oder (auf Vollständigkeit) in csh/tcsh:

setenv var `grep -c '123456789' filename` 
+0

+1 guter Punkt :) – Levon

+0

Dies funktioniert gut, da ich direkt die Daten eingeben. declare -a arr = ($ (awk '/ 123456789/{print NR}' Dateiname)) arr $ echo {arr [0]} echo $ {arr [*]} Bt wenn ich tun wie unten, es funktioniert nicht. Lassen Sie mich wissen, wie der Parameter 'name' int Befehl unten verwendet werden kann: echo Geben Sie Ihren Suchbegriff ein: lesen name deklarieren -a arr arr = ($ (awk '/ "$ name"/{print NR} 'Dateiname) echo $ {arr [0]} echo $ {arr [*]} –

+2

Es ist schwierig zu verstehen, was Sie aufgrund dieses Kommentars fragen, möglicherweise aufgrund der durch die Formatierung von SO verursachten Unordnung Bitte fügen Sie Ihrer Frage weitere Details hinzu, klicken Sie auf den Link [Bearbeiten] (http://stackoverflow.com/posts/10891817/edit) unter der Frage, nehmen Sie Ihre Änderungen vor und ich werde meine Antwort entsprechend aktualisieren. – ghoti

Verwandte Themen