Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Portada » Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 9 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Sab Feb 11, 2012 11:52 pm
Mensajes: 16

Nota Publicado: Mié May 02, 2012 10:03 pm 
Arriba  
Hola!! que tal ?? estoy en busca del aprendizaje en sed, me parece increíble pero ahí cosas que me parecen imposible de realizar o realmente no se como, necesitaría otro punto de vista para implementarlo.

La idea es almacenar el resultado del bucle en una variable, luego sustituir 37475-38200 por la variable a todo esto con sed.
Lo podria hacer manual pero resulta que en el archivo port-numbers2.txt me encuentro con cientos de ejemplos asi "37476-38200" y debo tener puerto por puerto como en el ejemplo del texto.


Código:
COUNT=37477
until [ $COUNT -gt 38200 ]; do
        echo $COUNT
        let COUNT=COUNT+1
done


a=$(./countport.sh)
cat port-numbers2.txt | sed 's/37475-38200/'"[for i in $a; do echo $i; done]"'/g'


Citar:
fragmento del archivo ]port-numbers2.txt
...
37475/udp Science + computing's Venus Administration Port
37476-38200 Unassigned
38201/tcp Galaxy7 Data Tunnel
38202 Unassigned
38203/tcp AppGate Policy Server
....


la idea es cambiar esto 37475-38200 por algo asi 37475, 37476, 37477, etc hasta llegar al 38200 ordenadamente (uno abajo del otro y con una cadena antes que diga ""unassigned-port")

se agradece. luis


Última edición por opmeitle el Vie May 04, 2012 6:54 am, editado 2 veces en total
 Perfil  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Dom Oct 10, 2004 7:00 am
Mensajes: 1465

Nota Publicado: Jue May 03, 2012 6:40 am 
Arriba  
Lo mismo que al otro usuario, con una duda parecida. Pero con un añadido: ese sed es un disparate. Copiaste y pegaste de alguna parte y así salen las cosas.
OMG, y acabo de ver el bucle for dentro de sed. Es peor de lo que parecía.

Lee este tutorial de sed: Sed Parte 1. Sed Parte 2. Sed Parte 3. . Lee especialmente la parte de comandos múltiples y creación de macros.

Por lo demás, ¿esto es una tarea que te pidieron realizar con sed?

Porque no estoy tan seguro de la utilidad de sed en el problema descripto. Seguramente puede hacerse (he hecho reemplazos endiabladamente complejos en sed), pero no estoy seguro de que sea más práctico que awk (o cut) + tr en el contexto de este problema.

 Perfil  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Sab Feb 11, 2012 11:52 pm
Mensajes: 16

Nota Publicado: Jue May 03, 2012 6:59 am 
Arriba  
neurus gracias, esperaba una respuesta así con info. de orientación, dispones de algun manual sobre awk o cut + tr?

 Perfil  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Dom Oct 10, 2004 7:00 am
Mensajes: 1465

Nota Publicado: Jue May 03, 2012 7:27 am 
Arriba  
Awk es un lenguaje de programación, en base al cual se crearon otros dos lenguajes: Perl y PHP. Esto quiere decir que cualquier cosa que quieras hacer en Bash, puedes hacerla completamente en Awk. Pero aprender a usarlo lleva mucho, mucho tiempo.

Yo tenía en papel este manual de Awk. Realmente no sé si alguien sigue programando en ese lenguaje. Yo, que lo conozco, dejé de usarlo hace años para programar cualquier cosa. Pero sigo usándolo para cosas básicas como imprimir campos: awk '{print $1}' imprime el primer campo, considerando como separador el espacio. El separador se cambia con -F. Ejemplo: awk -F / '{print $1}' usa "/" como separador.

tr reemplaza de este modo: tr 'carácter a reemplazar' 'carácter final'

cut funciona así:
Código:
cut -d / -f1
, donde -d cumple la función que cumple -F en awk, y -f1 la función de print $1 en awk.

Y en el ejemplo que pusiste basta con separar las líneas que tienen un guión (aparentemente es el patrón), y luego usarlas en un bucle for:

Código:
cat archivo|grep -|tr '-' ' '|awk '{print $1, $2}' >n.txt
for i in `seq $(cat n.txt)`; do echo $i Unassigned; done


Ya te di todas las herramientas y te hice el 90 por ciento del trabajo. Combinar esos datos en un archivo final corre por tu cuenta.

 Perfil  

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Jue Jun 17, 2010 5:23 am
Mensajes: 398
Ubicación: Venezuela

Nota Publicado: Jue May 03, 2012 9:49 am 
Arriba  
neurus escribió:
...Yo tenía en papel este manual de Awk. Realmente no sé si alguien sigue programando en ese lenguaje. Yo, que lo conozco, dejé de usarlo hace años para programar cualquier cosa. Pero sigo usándolo para cosas básicas como imprimir campos: awk '{print $1}' imprime el primer campo, considerando como separador el espacio. El separador se cambia con -F. Ejemplo: awk -F / '{print $1}' usa "/" como separador.


Este tip es importante para mi. Sólo hago el comentario para "saber que está aquí".

Saludos

_________________
[Reglamento del foro] [Blog]

 Perfil  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Sab Feb 11, 2012 11:52 pm
Mensajes: 16

Nota Publicado: Jue May 03, 2012 8:42 pm 
Arriba  
okok!! gracias por cada dato, desde ya conocí a seq para evitar los bucles mediocres de conteo y otra cosa mas la importancia de awk!!

pero! tengo un problema efectuó esto cat archivo | sed 's/37475-38200/"`seq 37476 38200`"/' y no sucede nada

 Perfil  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Dom Oct 10, 2004 7:00 am
Mensajes: 1465

Nota Publicado: Jue May 03, 2012 9:05 pm 
Arriba  
¿Leíste el tutorial que te pasé?
Son tres páginas, no vas a envejecer leyéndolo.

sed no ejecuta comandos dentro del reemplazo. Sed reemplaza. Eso fue lo que me pareció tan terrible en tu bucle for metido dentro de sed.

Sed sólo va a reemplazar un texto cualquiera por otro texto cualquiera.

Para usar ese texto dentro de un bucle existen otras herramientas, y de hecho ya te las di.

La única que tal vez te falte todavía para tener todo lo necesario para armar el script: sort ordena una lista.

 Perfil  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Sab Feb 11, 2012 11:52 pm
Mensajes: 16

Nota Publicado: Vie May 04, 2012 6:57 am 
Arriba  
si, ya tengo una idea clara de armar el script, justamente en sort estaba pensando para hacer un ordenamiento luego de cada salida, luego lo publico

Código:
eliminar=$(cat port.txt|grep -)

cat port-numbers2.txt|grep -|tr '-' ' '|awk '{print $1, $2}' > n.txt
for i in `seq $(cat n.txt)`;
    do echo $i Unassigned
done >> port1.txt

cat port1.txt >> port-numbers2.txt
cat port-numbers2.txt | sed -e '/'"$eliminar"'/d' | sort -r > port-numbers2.txt


bueno, así quedo el script modificado, ahora me surgió algo que debí haber explicado con anterioridad ya que puede modificar la estructura del código , resulta ser que el archivo "port-numbers2.txt" dispone de cientos similares a 37476-38200 Unassigned, es decir.

Citar:
# 47625-47805 Unassigned
# 47809-47999 Unassigned

# 48004-48555 Unassigned
48556/tcp com-bardac-dw
48556/udp com-bardac-dw
# 48557-48618 Unassigned

 Perfil  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Dom Oct 10, 2004 7:00 am
Mensajes: 1465

Nota Publicado: Vie May 04, 2012 8:06 am 
Arriba  
Bueno, pero no agregaste nada. Además, precisamente la idea de usar sort es poder mezclar todos los puertos en un archivo para después ordenarlos.

Primero: crear un archivo con los puertos no asignados. ¿Ahora parece que también pueden empezar por numeral? ¿Hay otras líneas que tienen guión? Si no hay un patrón, es sencillamente imposible. Casi siempre lo hay, pero eso lo tienes que saber tú. Suponiendo que el patrón es que tienen la palabra Unassigned:

Código:
cat archivoinicial|grep Unassigned|tr '-' ' '|awk '{print $1, $2}' > /tmp/noasignados


Luego, eso se lee con un bucle while:

Código:
while read line
    do
      for i in `seq $line`;
         do  echo $i Unassigned>> /tmp/puertos.txt;
      done;

   done </tmp/noasignados


Después, creás el archivo opuesto a noasignados. Es decir, se invierte el patrón:

Código:
cat archivoinicial|grep -v Unassigned >> archivofinal


Le agregás todos los puertos no asignados:

Código:
cat /tmp/puertos.txt >> archivofinal


Y lo sacás en orden:

Código:
cat archivofinal|sort


Ni era tan difícil, ni aportaste una línea. Si te ayudé hasta acá es porque intuyo que le estás poniendo algo de ganas de aprender. Pero a cada post se nota un poco menos.

Nota: si hay numerales adelante, hay que sacarlos antes de empezar, bien con tr, bien con sed. Con tr habría que reemplazarlos por nueva línea: \n, porque no acepta caracteres nulos.

 Perfil  
Mostrar mensajes previos:  Ordenar por  
 [ 9 mensajes ] 
Nuevo tema Responder al tema

Saltar a:  


 Temas relacionados   Autor   Respuestas   Vistas   Último mensaje 
Problemas con el bucle while

en Programación

Astrak

9

316

Sab May 05, 2012 1:18 pm

Astrak Ver último mensaje

array y bucle en php (SOLUCIONADO)

en Programación

greer

4

249

Jue Ene 19, 2012 7:39 pm

mcun Ver último mensaje

Procesar lineas con un bucle

en Programación

pappland

6

1020

Mié Ago 20, 2008 6:17 pm

pappland Ver último mensaje

Como bucle for en script iptables?

en Seguridad

sputnik99

3

498

Vie Sep 17, 2010 4:25 am

neurus Ver último mensaje

[YOUTUBE-Linus Easy] Canal de ayuda con Linux , programación y ayuda en general con la informática

en Tu Web

darkxemnas

3

162

Vie May 02, 2014 2:08 am

cristiani Ver último mensaje



¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC + 1 hora [ DST ]
Traducción al español por Huan Manwë
phpBB SEO