Autor
|
Tema: Concatenar un conjunto de palabras para la misma búsqueda con find o findstr (Leído 6,901 veces)
|
gregory90
Desconectado
Mensajes: 190
|
Buenas, Esto no es tanto de scripting pero no sabía muy bien donde encajarlo. Estoy intentando buscar a través del comando de entrada las determinadas cadenas de palabras, e probado muchas combinaciones diferentes y nada... Para que se entienda estes serían unos ejemplos: <comando de entrada> | find "<Conjunto de palabras a buscar literalmente en la salida del comando>" | find "<OTRO conjunto de palabras a buscar literalmente en la salida del mismo comando>" Otro ejemplo: <comando de entrada> | find "<Conjunto de palabras a buscar literalmente en la salida del comando>" && "<OTRO conjunto de palabras a buscar literalmente en la salida del mismo comando>" Pruebo lo mismo con findstr. La cuestión de todo esto, es intentar concatenar diversos términos literales dentro del comando find o findstr (u otro si lo hubiese). Gracias un saludo!
|
|
|
En línea
|
|
|
|
gregory90
Desconectado
Mensajes: 190
|
seguí probando y nada... no entiendo que más necesita el interprete para ejecutar una sintaxis de este tipo.
|
|
|
En línea
|
|
|
|
Zomkar
Desconectado
Mensajes: 180
|
Lo que sucede es que findstr te devuelve toda la linea, asi que lo que estas pasando entre pipes es cada vez lo mismo. Por ejemplo, asumiendo este string original: ejecutamos da comoresultado Asi que si luego tu querias extraer de ahi "cb", no puedes, ya que siempre te devolverá, mientras la búsqueda encuentre un resultado Para lo que quieres hacer puedes usar FOR /F con tokens y delims(si los datos tienen una estructura conocida), o con substring tambien podrias (te daría algo más de juego). Lo bueno de substring es que puedes obtener nuevas Strings con los datos que tu quieres solo indicando las cadenas a conservar/eliminar. Para cosas más complicadas te recomiendo que busques un codigo en VBS o powershell (o cualquier otro), no es que no se pueda hacer en batch pero se puede complicar mucho el codigo y creo que no vale la pena. PD: ahora me fijo que usabas find, pero el resultado para lo que explicaba es el mismo, no se devuelve la cadena, sino toda la linea. PD2: otra cosa que igual te sirve también es que si findstr encuentra un resultado errorlevel vale 0, entonces puedes usar algo como: set var=cadena1 FINDSTR /C "%cadena1%" > null IF ERRORLEVEL EQU 0 goto: cadena1Encontrada REM Si no.. goto:eof
|
|
« Última modificación: 16 Abril 2016, 20:35 pm por Zomkar »
|
En línea
|
|
|
|
gregory90
Desconectado
Mensajes: 190
|
Gracias por la respuesta @Zomkar, pero el tema no es el resultado que me devuelve, si eso lo hace bien ya que quiero que me devuelva la línea entera de la cadena.
La cuestión de esto, es que en una sola línea quería hacer todas las búsquedas de todas las líneas que contengan determinada palábra, para eso se me ocurrió contatenar varios find o findstr (me daría lo mismo para este caso) con un pipe (|) de modo que en cada find ir incluyendo la palabra que estará en la línea a mostrar.
La cuestión es cómo enlazar varios comandos find o findstr en una sola líniea o sentencia para encontrar palabras de diferentes líneas.
|
|
|
En línea
|
|
|
|
Zomkar
Desconectado
Mensajes: 180
|
De nada! A mi me funciona así: C:\Users\>echo aaaa | findstr /C:"a" | findstr /C:"a" aaaa
C:\Users\>echo aaaa | findstr /C:"a" | findstr /C:"b"
C:\Users\>
Creo que tu quieres buscar las lineas que contengan "abc" y además que contengan "xyz", es asi? Y que si lo encuentran las muestre. Para eso sirve con este ejemplo. Si es otra cosa a ver si puedes explicar mejor.
|
|
|
En línea
|
|
|
|
gregory90
Desconectado
Mensajes: 190
|
En el segundo ejemplo que pusiste, se ve como buscando "a" y "b" no devuleve nada pese a que "a" si que existe y aunque "b" no. C:\Users\>echo aaaa | findstr /C:"a" | findstr /C:"b"
C:\Users\> Yo quiero hacer algo similar a eso, pero que si que me lo muestre. Imaginemos que es lo siguiente: Hago un dir en mi directorio y me muestra los siguiente: C:\Users\gregor>dir El volumen de la unidad C no tiene etiqueta. El número de serie del volumen es: A881-83A4
Directorio de C:\Users\gregor
11/04/2016 00:05 <DIR> . 11/04/2016 00:05 <DIR> .. 13/04/2016 11:18 <DIR> .oracle_jre_usage 15/04/2016 20:08 <DIR> .VirtualBox 15/10/2015 01:10 <DIR> .zenmap 07/03/2016 10:17 <DIR> Contacts 18/04/2016 09:32 <DIR> Desktop 13/04/2016 20:58 <DIR> Documents 13/04/2016 12:05 <DIR> Downloads 18/04/2016 08:35 <DIR> Dropbox 07/03/2016 10:17 <DIR> Favorites 07/03/2016 10:17 <DIR> Links 17/02/2016 15:44 <DIR> MindTerm 07/03/2016 10:17 <DIR> Music 25/01/2016 00:38 <DIR> OneDrive 11/04/2016 18:28 <DIR> Pictures 07/03/2016 10:17 <DIR> Saved Games 07/03/2016 10:17 <DIR> Searches 11/04/2016 00:05 70 sha1sum.txt 11/04/2016 18:28 <DIR> Videos 1 archivos 70 bytes 19 dirs 286.476.800.000 bytes libres Ahora quiero solo coger tres líneas que contengan determinadas palabras, por ejemplo, desktop, Favorites y Music. Al introducir el comando y contatenar el findstr con un pipe (|), este como restultado no me muestra nada. C:\Users\gregor>dir | findstr /C:"Desktop" | findstr /C:"Favorites" | findstr /C:"Music"
C:\Users\gregor> Lo que quiero conseguir es que haciendo lo anterior, con la sintaxis correcta, me muestre esto (este resultado lo puse a mano para intentar reflejar el resultado de lo que busco): C:\Users\gregor>dir | findstr /C:"Desktop" | findstr /C:"Favorites" | findstr /C:"Music" 18/04/2016 09:32 <DIR> Desktop 07/03/2016 10:17 <DIR> Favorites 07/03/2016 10:17 <DIR> Music Espero que con esto me explicara claramente ahora
|
|
|
En línea
|
|
|
|
Zomkar
Desconectado
Mensajes: 180
|
Vale, ahora si te entiendo. A ver, lo primero, porque falla? Las pipes (|) redirigen la salida de un comando al input de otro. En la practica esto hace que: dir | findstr /C:"Desktop" | findstr /C:"Favorites" Significa que el findstr "Desktop" buscará en toda la salida de dir, que ya pusiste, y mostraría 18/04/2016 09:32 <DIR> Desktop Pero, como estamos redirigiendo el output, no muestra nada, se lo pasa como input al siguiente comando, findstr /C:"Favorites". Éste al ejecutarse, tiene como input la linea de Desktop, y no todo el comando Dir original. Como en esa linea no hay "Favorites" no muestra nada. Espero que se entienda. Ahora vamos a como hacer lo que quieres: dir | findstr "Desktop Favorites Music" Quitando la opción /C, es cuestion de pasar todas las cadenas de texto que se quieran encontrar entre comillas, separadas de un espacio.
|
|
|
En línea
|
|
|
|
gregory90
Desconectado
Mensajes: 190
|
Ok, probado y me sirve, exactamente era eso! más fácil de lo que pensaba... y yo intentando concatenar de mil formas posibles... :/ jaja
Gracias zomkar!
|
|
|
En línea
|
|
|
|
Zomkar
Desconectado
Mensajes: 180
|
De nada, me alegro que te sirva
|
|
|
En línea
|
|
|
|
andres3626
Desconectado
Mensajes: 1
|
Buenas tardes. Su ayuda por favor. Tengo un archivo que tiene la siguiente linea 192.168.1.1 y deseo que el batch haga lo siguiente Si encuentra 192.168.1.1 escribir en archivo 192.168.1.2 escribir en archivo 192.168.1.3 Si no encuentra 192.168.1.1 escribir en archivo 192.168.1.1 escribir en archivo 192.168.1.2 escribir en archivo 192.168.1.3
tengo algo como esto FINDSTR /I "192.168.1.1" %windir%\system32\drivers\etc\hosts.* | FINDSTR /I "192.168.1.2" %windir%\system32\drivers\etc\hosts.*
Pero no me funciona. Alguien con alguna idea de como puede ser el batch? Muchas gracias...
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Necesito una DB en SQL de un diccionario o conjunto de palabras
Foro Libre
|
H4RR13R
|
0
|
2,074
|
1 Julio 2010, 00:54 am
por H4RR13R
|
|
|
Busqueda binaria con palabras
Programación C/C++
|
soez
|
0
|
3,146
|
3 Agosto 2010, 04:10 am
por soez
|
|
|
PROBLEMA PARA CONCATENAR C#
.NET (C#, VB.NET, ASP)
|
SAGA-gl
|
5
|
4,282
|
6 Abril 2014, 20:02 pm
por El Benjo
|
|
|
Código que me pemita saber cuantas palabras empiezan y acaban con la misma letra
« 1 2 »
Programación C/C++
|
divax
|
11
|
14,903
|
22 Marzo 2015, 13:48 pm
por ivancea96
|
|
|
busqueda de palabras en un fichero
Programación C/C++
|
johnnyd77
|
3
|
4,038
|
30 Junio 2016, 18:36 pm
por AlbertoBSD
|
|