Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

202
Vistas
Bash regex analizando la salida ss

Estoy tratando de usar una expresión regular de bash de una salida de comando ss para extraer el nombre de la aplicación que está usando un puerto determinado en una función. Tengo algunos problemas con la expresión regular.

El comando para verificar los datos es ss -tupln

Ejemplo de datos para analizar (ipv4):

 tcp LISTEN 0 10 0.0.0.0:80 0.0.0.0:* users:(("nc",pid=3474,fd=4)) tcp LISTEN 0 10 [::]:80 [::]:* users:(("nc",pid=3474,fd=3))

En este caso quiero extraer nc que es el nombre del programa que usa el puerto

Ejemplo de datos para analizar (ipv6):

 tcp LISTEN 0 511 *:80 *:* users:(("apache2",pid=6741,fd=4),("apache2",pid=6740,fd=4),("apache2",pid=6738,fd=4),("apache2",pid=6737,fd=4),("apache2",pid=6736,fd=4),("apache2",pid=6724,fd=4))

En este caso, quiero extraer apache2 , que es el nombre del programa que usa el puerto.

Necesito una expresión regular general válida para ambos casos. No me importa si se obtiene usando grep o si se hace usando pure bash regex. Mi enfoque no laboral:

 #!/bin/bash get_name() { local regexp="${1}.*[0-9\*]:${2}[[:blank:]]+.*[[:blank:]]+users:\(\(\"(.+)\"\," [[ $(ss -tupln) =~ ${regexp} ]] && process_name="${BASH_REMATCH[1]}" echo "${process_name}" } get_name "tcp" "80"

Gracias.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Puedes usar awk así:

 $ ss -tupln | awk -v proto=tcp -v port=80 '$1 == proto && $5 ~ ":" port "$" {split($0, array, "\""); print array[2]}' apache2
over 4 years ago · Santiago Trujillo Denunciar

0

Puede usar gnu grep:

 ss -tupln | grep -oP 'tcp\h.*?:80\h.*?\busers:\(\("\K[^"]+(?=")'

El patrón coincide:

  • tcp\h Coincide con tcp y un espacio
  • .*?:80\h Haga coincidir la menor cantidad posible de caracteres y luego :80 y un espacio
  • .*?\busers: coincidir la menor cantidad posible de caracteres y luego users:
  • \(\(" partido (("
  • \K[^"]+ Olvídese de lo que coincida demasiado (no será parte de la coincidencia resultante)
  • (?=") Anticipación positiva, afirmación = directamente a la derecha

Ver una demostración de expresiones regulares

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda