Archives for 

archivo de texto

[How to] Como Recorrer un archivo de texto desde BASH

bash

Si deseas recorrer un archivo de texto linea por linea desde BASH, para realizar diversas operaciones con dichas lineas, debes realizar un while, este se encargara de recorrer todo el archivo hasta llegar al final: Podemos hacer algo asi:

while read linea
do
  //operaciones con las lineas
done < archivo

Donde archivo, es el nombre del archivo que se va a recorrer.

Ejemplo

Supongamos que tengo un archivo llamado lista con la siguiente estructura con mas de 5000 registros:

pedro:perez:3332211
pablo:lopez:11223344
juanita:cardona:6554321

y me solicitan sacar una lista solo con el nombre y no con el numero telefonico. Para hacer esto desarrollamos un pequeño script en BASH:

#!/bin/bash
while read line
do 
  echo $line | awk -F ":" {'print $1,$2'}
done < lista

Ahora ejecutamos el script y el resultado seria algo como esto:

pedro perez
pablo lopez
juanita cardona

 

Como dividir un archivo de texto demasiado grande

Algunas veces resulta muy molesto trabajar con archivos  de texto  demasiado grandes, ya que para visualizarlos el sistema debe cargar  el archivo completo en la memoria de nuestra maquina,  si estamos trabajando con archivos  de 10 millones de lineas en adelante,  al abrirlo este consumira demasiada memoria y hará que nuestro sistema colapse por completo.

Para solucionar este incomodo problema, los entornos unix traen una utilidad llamada split, la cual nos ayuda como su nombre lo indica a dividir o partir un archivo de texto el cual sea demasiado grande.

La sintaxis de split es:

split [parámetros opcionales] [archivo de entrada] [archivo de salida]

Entre los parámetros tenemos:

  • -l -> numero de lineas en las que se va a dividir o partir el archivo por defecto son 1000
  • -b -> divide el archivo no por lineas, sino por tamaño (expresado en bits)
  • -b k n -> divide el archivo no por lineas, sino por tamaño (donde n es un multiplo de 1024 bytes)

Después de los parámetros,  le damos el archivo de entrada y un nombre de salida,  hay que aclarar que el archivo de salida tendrá la siguiente notación:

nombrea nombreb nombrec nombred nombree nombref etc……

Algunos ejemplos:

split -l 5000 diccionario.txt parte-

Esta sentencia me arrojara  lo siguiente:

parte-a parte-b parte-c  hasta que el archivo quede completamente dividido-

Algo muy sencillo pero util,  trabajar con backups o archivos de textos que este en el orden de los millones. Por ultimo si alguien posteriormente desea  pegar las partes lo puede hacer muy facilmente usando cat.

cat parte-a parte-b parte-c > todocompleto.txt

Script para enviar Spam o MailBomber

Algunas veces es necesario hacer un poco de spam por diferentes motivos: SEO, dinero etc.  estando en algun canal de IRC algún usuario (que no recuerdo su nombre) compartio este script el cual sirve para enviar un mensaje a muchos destinatarios diferentes, (si tienen maldad, se imaginan si mandamos el mismo mensaje a  un solo destinatario?).  Su funcionamiento es muy sencillo, solo necesitamos un archivo de texto  con todos los destinatarios y tener python instalado en nuestro PC . Después de tener todo esto listo, solo basta ejecutar esto en una consola:

chmod 777 mail.py
./mail.py destinatarios.txt

Al ejecutarlo el script nos pedirá  los datos de autenticación de la cuenta que va hacer el papel de remitente,  el numero de mails a enviar (parametro que no funciona como debería hacerlo),  el asunto y cuerpo del mensaje, inmediatamente  le entregamos estos datos, el script empieza hacer su trabajo. El código de este programa es el siguiente:

#!/usr/bin/python
################################################################ 
#       .___             __          _______       .___        # 
#     __| _/____ _______|  | __ ____ \   _  \    __| _/____    # 
#    / __ |\__  \\_  __ \  |/ // ___\/  /_\  \  / __ |/ __ \   # 
#   / /_/ | / __ \|  | \/    <\  \___\  \_/   \/ /_/ \  ___/   # 
#   \____ |(______/__|  |__|_ \\_____>\_____  /\_____|\____\   # 
#        \/                  \/             \/                 # 
#                   ___________   ______  _  __                # 
#                 _/ ___\_  __ \_/ __ \ \/ \/ /                # 
#                 \  \___|  | \/\  ___/\     /                 # 
#                  \___  >__|    \___  >\/\_/                  # 
#      est.2007        \/            \/   forum.darkc0de.com   #
#                                         www.beenuarora.com   #
################################################################
#Thanks to low1z for initial script
#Greetz to all darkc0de memeber

import os, smtplib, mimetypes,time,sys,urllib,urllib2
from email.MIMEMultipart import MIMEMultipart 
from email.MIMEText import MIMEText 
 
def sendMail(gmailUser,gmailPassword,recipient,subject,text): 
 
 msg = MIMEMultipart() 
 msg['From'] = gmailUser 
 msg['To'] = recipient 
 msg['Subject'] = subject 
 msg.attach(MIMEText(text)) 
 mailServer = smtplib.SMTP('smtp.gmail.com', 587) 
 mailServer.ehlo() 
 mailServer.starttls() 
 mailServer.ehlo() 
 mailServer.login(gmailUser, gmailPassword) 
 mailServer.sendmail(gmailUser, recipient, msg.as_string()) 
 mailServer.close() 
 print('[-] Sent email to %s :' % recipient) 
if sys.platform == 'linux-i386' or sys.platform == 'linux2' or sys.platform == 'darwin':
 SysCls = 'clear'
elif sys.platform == 'win32' or sys.platform == 'dos' or sys.platform[0:5] == 'ms-dos':
 SysCls = 'cls'
else:
 SysCls = 'unknown'

os.system(SysCls)

print "\n|---------------------------------------------------------------|"
print "| beenudel1986[@]gmail[dot]com                                  |"
print "| Spomb v1.0                                                    |"
print "|   Do Visit     www.BeenuArora.com      &        darkc0de.com  |"
print "|---------------------------------------------------------------|\n"
 
if len(sys.argv) < 2: 
 print "\nUsage: ./spammer.py list.txt" 
 print "Ex: ./spomb.py list.txt\n" 
 sys.exit(1)

list= sys.argv[1] 
try:

 hosts= open(list,'r')
except (IOError):
 print " \n\nSpamming List Missing ..Exiting :("
 sys.exit(0)


count= raw_input('Enter the Number of mails :')
gmailUser = raw_input('Enter Your Email ID :') 
if sys.platform == 'linux-i386' or sys.platform == 'linux2' or sys.platform == 'darwin':
 os.system('stty -echo')
gmailPassword = raw_input('Enter Your Gmail Password :') 
list= sys.argv[1]
if sys.platform == 'linux-i386' or sys.platform == 'linux2' or sys.platform == 'darwin': 
 os.system('stty echo')
subject = raw_input('\nSubject :') 
text = raw_input('Text :')
for a in range (0,int(count)):
 for host in hosts:
 recipient=host[:-1]
 try: 
 sendMail(gmailUser,gmailPassword,recipient,subject,text) 
 time.sleep(10)
 except(urllib2.URLError, socket.timeout, socket.gaierror, socket.error): 
 print ('Something Went Wrong ..Check Manually for Error\n') 
 except(KeyboardInterrupt): 
 pass 
print ('\n\nDone Mailing...')

Tuve la oportunidad de probarlo, y hay varias cosas negativas que aclarar:

  1. Como dije anteriormente el parametro de numeros de mensajes no funciona adecuadamente.
  2. Despues de un tiempo enviando correos,  gmail cerro la conexion, y no se podia conectar  despues de 3 horas mas, al parecer gmail bloquea la cuenta por tratarse de spam

No tengo nada mas que decir, espero que lo prueben y me cuenten sus comentarios

MDBTools: herramienta para visualizar bases de datos access en GNU/Linux

Hace ya varios días mi profesor de bases de datos, dejo en Internet una base de datos para hacer un taller. (Hasta ahí todo normal) Pero cuando descargue el archivo resulta que dicho archivo tenía extensión .mdb (Archivo de access). Lo primero que pensé fue listo debe haber algo con lo que se pueda abrir esta cosa en mi Debian. Basto con buscar en Google y en 5 minutos encontré esta aplicación MDBTools gracias a la cual pude terminar mi tarea XD.

MDBTools es una herramienta que nos permite exportar datos y esquemas desde archivos producidos por MS Access 97/2000/XP/2003.

mdbtools

Para instalar:

# aptitude install mdbtools

Si prefieres descargar las fuentes acá.

El modo de uso es muy sencillo, simplemente abres el archivo .mdb y te mostrará algo como la imagen de arriba (Muestra las tablas de la base de datos).

Definition: Permite ver la definición de la tabla (Nombres de campos, tipo de datos, tamaño y las keys).

Data: Muestra las tablas con los datos.

Export: Con esta opción podemos exportar los datos de las tablas a un archivo de texto.

Adicional a estas opciones hay otra que nos permite hacer Queries. (A la cual accedemos dando click en el icono de los dos engranajes)

mdbtools2

Con respecto a esta última opción tengo para decir que no me han funcionado consultas más estructuradas, solamente las simples.

No es más espero que sea de utilidad para alguien . Hasta la próxima!!.

Mi primer programa de shell

como todos sabemos una shell es una linea de comandos o mas bien dicho un interprete de comandos que usamos a diario para hacer todo tipo de tareas administrativas, obviamente bajo sistemas UNIX (basados en Unix), algunas tareas sencillas como montar una unidad, configurar una interfaz ( interface ) de red, hacer cosas mas avanzadas como port scanning etc, son tareas que podemos hacer por medio de nuestra ya mencionada shell; algunas de estas tareas podrían ocurrir al iniciar el sistema pero no siempre es la mejor opcion o la que nosotros deseamos, para quienes vivimos este caso en el que al iniciar nuestro S.O. Comenzamos a usar una larga lista de comandos como montar la unidad de datos o en otras ocasiones la unidad de proyectos o cosas así por el estilo, esto a veces se puede volver tedioso y quitarnos un poco de tiempo mientras lanzamos los comandos , pero que mejor que lanzar un solo comando y hacer todo el proceso de manera mas amigable, pues bien esa opción también nos la da nuestra querida shell ya que esta a su vez también funciona como un completo lenguaje de programación. ¿Pero como funciona este lenguaje? Si nos vamos a una terminal y digitamos date nos daria un resultado como:

/home/usuario$ date
mié sep 2 22:48:38 COT 2009

Bien ahora escribamos el mismo comando en un archivo de texto, para ello hacemos lo siguiente:

$vi miarchivo

presionamos a para comenzar a escribir en el editor de texo

escribimos date

presionamos esc para volver a modo comando en el vi

presionamos ZZ para salir del vi y guardar los cambios.

(el archivo lo podemos crear con cualquier editor de texto como el gedit, kate etc)

para comprobar que si quedo bien el archivo ejecultamos el comando

$cat miarchivo

nos debera devolver un resultado como:

/home/usuario$ cat ejemplo

date

Ahora vamos a darle permisos de ejecucion a nuestro script, para ello ejecutamos el comando :

/home/usuario$chmod +x miarchivo

Ahora vamos a ejecutar el archivo llamandolo por su nombre y anteponiendo “./” de la siguiente manera:

/home/usuario$./miarchivo

y veremos como nos da el resultado:

/home/usuario$./miarchivo

mié sep 2 22:57:33 COT 2009

Hemos visto como podemos llamar un comando desde un script en un archivo de texto plano, solo con escribir el comando en el archivo. Las posibilidades son enormes y podemos hacer una secuncia de archivos completa, escribir resultados en una caja de texto, la sitanxis es muy similar a cualquier lenguaje, podemos usar condiciones if, ciclos como while, y un sin fin de opciones, algun ejemplo de sintaxis para una condicion:

if condicion; then

comandos;

[elif otra_condicion; then

comandos;]

[else comandos(en caso contrario);]

fi

Para conocer mas a fondo la sintaxis y las posibilidades que tenemos podemos consultar la guia oficial haciendo click aqui.

Para terminar quiero  dejarles un ejemplo de un sencillo script que nos permite configurar una interface de red, el router y el DNS. de esta forma pueden abrir sus mentes y darse cuenta que con esto podemos hacer un sin numero de cosas.

echo “iniciando la configuracion de la red”;
echo “Ingresa la direccion IP que asignaras a la interface”;
read ip;
echo “Ingresa la direccion de mascara para la interface de red”;
read mask;
echo “Ingresa la IP del router” ;
read gw;
echo “Ingresa el direccion del DNS”;
read dns;
echo “haz ingresado la direccion IP $ip , la mascara $mask el DNS $dns y el router $gw, Presiona enter para terminar.” ;
read cont;
ifconfig eth0 $ip
ifconfig eth0 netmask $mask
route default gw $gw eth0
cd /etc/ echo “nameserver $dns” >> resolv.conf