Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: gregory90 en 14 Abril 2016, 11:25 am



Título: Concatenar un conjunto de palabras para la misma búsqueda con find o findstr
Publicado por: gregory90 en 14 Abril 2016, 11:25 am
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:
Código:
<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:
Código:
<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!


Título: Re: Concatenar un conjunto de palabras para la misma búsqueda con find o findstr
Publicado por: gregory90 en 15 Abril 2016, 09:10 am
seguí probando y nada...
no entiendo que más necesita el interprete para ejecutar una sintaxis de este tipo.


Título: Re: Concatenar un conjunto de palabras para la misma búsqueda con find o findstr
Publicado por: Zomkar en 15 Abril 2016, 19:59 pm
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:
Código:
abcdacb

ejecutamos
Código:
FINDSTR /C:"acb"
da comoresultado
Código:
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
Código:
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:
Código:
set var=cadena1
FINDSTR /C "%cadena1%" > null
IF ERRORLEVEL EQU 0 goto: cadena1Encontrada
REM Si no..
goto:eof


Título: Re: Concatenar un conjunto de palabras para la misma búsqueda con find o findstr
Publicado por: gregory90 en 18 Abril 2016, 01:03 am
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.


Título: Re: Concatenar un conjunto de palabras para la misma búsqueda con find o findstr
Publicado por: Zomkar en 18 Abril 2016, 02:34 am
De nada! A mi me funciona así:

Código:
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.


Título: Re: Concatenar un conjunto de palabras para la misma búsqueda con find o findstr
Publicado por: gregory90 en 18 Abril 2016, 12:20 pm
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ódigo:
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ódigo:
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ódigo:
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ódigo:
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


Título: Re: Concatenar un conjunto de palabras para la misma búsqueda con find o findstr
Publicado por: Zomkar en 18 Abril 2016, 22:44 pm
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:
Código:
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
Código:
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:
Código:
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.


Título: Re: Concatenar un conjunto de palabras para la misma búsqueda con find o findstr
Publicado por: gregory90 en 19 Abril 2016, 00:51 am
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!


Título: Re: Concatenar un conjunto de palabras para la misma búsqueda con find o findstr
Publicado por: Zomkar en 19 Abril 2016, 01:53 am
De nada, me alegro que te sirva :)


Título: Re: Concatenar un conjunto de palabras para la misma búsqueda con find o findstr
Publicado por: andres3626 en 26 Noviembre 2019, 19:50 pm
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...