extraer lineas txt y crear txt [batch]

Iniciado por presen, 9 Noviembre 2009, 01:52 AM

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

presen

Hola, soy principiante en bat, he buscado respuestas por el foro, pero no encuentro
la solucion a lo k quiero hacer
estoy intentando crear un script que haga lo siguiente:
ping a varias ips externas, guarde el resultado en un txt
y despues me copie las lineas que yo quiero en otros 2 txt. uno k se llame ok, donde ponga las k responden y otro txt llamado down donde ponga las k no respoden.

los dos primeros pasos los consigo, pero en el txt de down no encuentro la formula para que sea perfecto
ya que si una ipo no responde lo guardado es de la siguiente forma:

Haciendo ping a 82.26.13.48 con 32 bytes de datos:

Tiempo de espera agotado para esta solicitud.

Estad¡sticas de ping para 82.26.13.48:
Paquetes: enviados = 1, recibidos = 0, perdidos = 1
(100 perdidos),

y no consigo ninguna manera de copiar, por ejemplo la linea 1 y la 3, partiendo de la base de k no tiene por k ser ese el orden, ya k la anterior ip puede responder o no, luego el txt no tiene siempre la misma estructura.

Espero haberme explicado y k alguien k sepa me de un encaminamiento

Este el codigo k estoy utilizando para hacer el ping y k lo pase al 1er txt:

ALARMA.BAT

echo ================================================>> resultado.txt
echo =============== Fecha : %date% =============>> resultado.txt
echo =============== Hora : %time% =============>> resultado.txt
echo ================================================>> resultado.txt
for /F "tokens=*" %%a in (IPext.txt) do (
ping -n 1 %%a >> resultado.txt
echo ______________________________________________________________>> resultado.txt
)
call dns.bat


DNS.BAT
@echo off
echo ==============================================================>> ok.txt
echo ==================== Fecha : %date% ======================>> ok.txt
echo ==================== Hora : %time% ======================>> ok.txt
echo ==============================================================>> ok.txt
FINDSTR Respuesta resultado.txt >> ok.txt
echo ______________________________________________________________>> ok.txt
call down.bat

Este codigo me lista y guarda en ok.txt una salida k me vale:
Respuesta desde 82.26.13.48: bytes=32 tiempo=107ms TTL=246

DOWN.BAT
aki es donde tengo el problema ya k no se como tomar las referencias de la ip k me falla.
el codigo k tengo no me sirve, ya k no soy capaz de extraer la linea de la ip + la de Tiempo de espera agotado para esta solicitud.

Espero no haber sido demasiado farragoso

gracias

flony

#1
para copiar una linea usando el edlin es
CitarCopiar   [línea_inicio],[línea_fin],a_línea[,veces]C
un ejemplo @echo off
(
echo 1,1,100,1c
echo e
) | edlin /b texto2.txt

y si queres la linea 2 cambia y pone
echo 2,2,100,1c
esto esta sacado del manual de leo guitierrez la pagina
Citarhttp://foro.elhacker.net/scripting/acciones_sobre_archivos_de_texto_batch-t242748.0.html
... ;D funciona esta probado
che para q no te jodan pone los code en la casilla de insertar codigo arriba de las caritas xq si no te cierran la pregunta
si un problema no tiene solucion entonces no es un problema...es algo inevitable

presen

Gracias por la respuesta. y por la aclaracion de donde poner el codigo, lo siento
ya Habia leido el manual de Leo Gutierrez
Pero esta respuesta es para el caso k sepas lo k hay escrito en el txt y conozcas la linea k kieres copiar, yo lo k quiero, a ver si me explico mejor, es localizar una linea k tenga el texto xxxxx y copiar esa linea y 3 por encima de ella, asi si la respuesta es la siguiente:

Haciendo ping a 80.24.34.171 con 32 bytes de datos:

Tiempo de espera agotado para esta solicitud.

Estad¡sticas de ping para 80.34.33.171:
Paquetes: enviados = 1, recibidos = 0, perdidos = 1
(100 perdidos),

localizo la linea k contenga "agotado", asi se k hay un error de ping, la copio en un txt llamado down.txt
pero ahora me gustaria copiar 3 lineas arriba la de Haciendo ping.... para saber donde se ha producido el error. Mi problema es k no se k ip es la k me va a fallar, luego no se k lineas copiar, no hay un orden
Espero haberme explicado mejor.
Muchas gracias

flony

Citarhttp://foro.elhacker.net/scripting/ubicar_linea_en_txt_conociendo_palabra_batch-t271374.0.html
...yo tenia una duda parecida y mas o menos esto te puede servir....es un code largo pero con unas modificaciones t puede servir...y esta bien explicado...
si un problema no tiene solucion entonces no es un problema...es algo inevitable

presen

Gracias, creo k por ahi si. en cuanto lo tenga te lo enseño
Un saludo

<ИΘZIЭ(ŦB>

#5
Vé a ver si esto te sirve. Necesitas tener un archivo de texto (IPList.log) que contenga una IP o Host en cada línea. No importa cuántas líneas tenga; lo que cuenta es que haya una IP en cada una. A partir de ahí todo resulta bien.

Código (dos) [Seleccionar]

@echo off
cls
set cont=0
title Ping Maker [v0.1] By ^<N0ZI3(FB^>
If exist "%~dp0IPList.log" (goto Read) else (goto Error)

:Read
for /f "useback tokens=*" %%L in ("%~dp0IPList.log") do (
    echo. & echo   Procesando %%L & echo.
    set "host=%%L"
    ping %%L >"%temp%\ping.log"
    call:SaveLog1
)
If not defined host (
    echo. & echo  ERROR: La lista de IP's est  vac¡a. & sleep 2
    echo. & echo Cerrando...
    sleep 5
    exit /b
)
echo. & echo Terminado.
del "%temp%\ping.log"
pause>nul
exit

:SaveLog1
If [%errorlevel%] == [0] set "opFile=%~dp0ping_OK.log"
If [%errorlevel%] == [1] set "opFile=%~dp0ping_Down.log"
(echo   Resultados de %host% & echo.)>>"%opFile%"
For /f "useback tokens=*" %%S in ("%temp%\ping.log") do (
    set "line=%%S"
    call:SaveLog2
)
If [%errorlevel%] == [0] (
    echo -------------------------------------------------------------------------------
    echo ------------------------------------------------------------------------------->>"%opFile%"
)
echo. >>"%opFile%"
goto:eof

:SaveLog2
If ["%line%"] neq [""] (
    echo %line%
    echo %line% >>"%opFile%"
) else (
    echo -------------------------------------------------------------------------------
    echo ------------------------------------------------------------------------------->>"%opFile%"
)
goto:eof

:Error
echo. & echo  ERROR: No se encontr¢ la lista de IP's (IPList.log).
echo  Debe crearla en el directorio actual y ejecutar
echo  nuevamente la aplicaci¢n. & sleep 2
echo. & echo  Cerrando...
sleep 10
exit /b


Pruébalo y verás.. Avisa qué tal te va con él.

Saludos.

OJO: Acabo de hacerle un pequeño ajuste respecto al archivo que guardo en %temp%, por si habían copiado el código. Sería bueno que lo copien otra vez.

flony

guau  :o ...eso estuvo de diez  ;-)...creo q eso es lo q pide...ya me pongo a verlo :huh:  :silbar:
si un problema no tiene solucion entonces no es un problema...es algo inevitable

presen

Impresionante!!!!!, eso es justo lo k necesitaba, pero en weno. gracias es PERFECT  ;-)
Te lo agradezco mucho -=cym@n=-
La verdad es k me hace un papelon a pesar de k no entiendo una gran parte del codigo
Tengo solo las noches para estudiar y ese nivel es demasiado complejo para mi.
:o
estaba dandole vueltas al asunto, y andaba comiendome el coco, entre numeraciones de lineas y copia y pega en archivos, años luz de esto. AUN ASI, jeje, en cuanto me funcione la publico.... espero no tardar demasiado.

Sera la version muy muy muy cutre de esta.


Gracias de nuevo