Concatenar un conjunto de palabras para la misma búsqueda con find o findstr

Iniciado por gregory90, 14 Abril 2016, 11:25 AM

0 Miembros y 1 Visitante están viendo este tema.

gregory90

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!

gregory90

seguí probando y nada...
no entiendo que más necesita el interprete para ejecutar una sintaxis de este tipo.

Zomkar

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:
abcdacb

ejecutamos
FINDSTR /C:"acb"
da comoresultado
abcdacb

Asi que si luego tu querias extraer de ahi "cb", no puedes, ya que siempre te devolverá, mientras la búsqueda encuentre un resultado
abcdacb

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
Si vas a por ellos te llamarán violento.
Si explotas a cientos te verán como un ejemplo.

gregory90

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.

Zomkar

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.
Si vas a por ellos te llamarán violento.
Si explotas a cientos te verán como un ejemplo.

gregory90

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 :D

Zomkar

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.
Si vas a por ellos te llamarán violento.
Si explotas a cientos te verán como un ejemplo.

gregory90

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!

Zomkar

Si vas a por ellos te llamarán violento.
Si explotas a cientos te verán como un ejemplo.

andres3626

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...