2012-06-05 7 views
7

Estoy tratando de encontrar la cantidad de veces que una cadena se repite en un archivo, al mismo tiempo que debo almacenarla en una variable.Cómo almacenar el valor del comando cat en la variable var?

Cuando uso el comando (cat filename | grep -c '123456789'), muestra el recuento correctamente pero cuando uso el siguiente comando se muestra como comando no encontrado.

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

¿Me puede decir dónde me equivoco?

+0

¿Necesita las comillas simples alrededor de su cadena de búsqueda para grep? – Levon

+0

@Levon, las comillas simples alrededor de la expresión regular para grep solo serían necesarias si la expresión regular contiene caracteres que el intérprete interpretaría, como '$' o '[' o ']'. Como una expresión regular muy simple que no contiene caracteres especiales, '123456789' no necesita ser citado. – ghoti

Respuesta

16

No utilice espacios alrededor del signo =:

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

leer por lo menos el Bash Prog Intro Howto

Pero usted tiene un uso inútil de código cat por lo que simplemente

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

El uso de comillas inversas también funcionará:

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

Es decir, $ no es necesario, puede asignar la salida de varios comandos a variables mediante el uso de comillas inversas.

Por ejemplo:

$ pwd 
/home/user99 

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

Eso funciona porque eliminaste el espacio antes del '='; podrías haber mantenido la notación '$ (' ... ')' (más legible y * identificable *) en lugar de las comillas invertidas –

+0

@ Levon: ¿No es necesario usar el símbolo $ en el comando de arriba? –

+0

@JackieJames No es necesario, el comando funciona como se muestra, puede usar las comillas inversas en su lugar. Lo he usado tanto con bash como con el tcsh. ¿Tuviste problemas al intentar esto? – Levon

6

Recuerde que grep puede leer el archivo directamente. Puede evitar useless use of cat.

En el ejemplo de su pregunta, el comando no encontrado error se produce debido al espacio antes del signo igual. Tal vez puedas probar:

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

o si está usando bash:

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

o (para lo completo) en CSH/tcsh:

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

+1 buen punto :) – Levon

+0

Esto funciona bien ya que estoy ingresando los datos directamente. declarar -a arr arr = ($ (awk '/ 123456789/{print NR}' nombre del archivo)) echo $ arr {[0]} { echo $ arr [*]} Bt cuando lo hago como abajo, no funciona. ¿Puede indicarme cómo se puede utilizar el parámetro 'nombre'? Comando int a continuación: echo Introduzca su cadena de búsqueda: lea el nombre declare -a arr arr = ($ (awk '/ "$ name"/{print NR} 'nombre de archivo) echo $ {arr [0]} echo $ {arr [*]} –

+2

Es difícil entender lo que se pregunta en base a este comentario, posiblemente debido al lío hecho por el formato de SO. Necesito agregar más detalles a su pregunta, haga clic en el enlace [editar] (http://stackoverflow.com/posts/10891817/edit) debajo de la pregunta, realice los cambios y actualizaré mi respuesta en consecuencia. – ghoti

Cuestiones relacionadas