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.
Puedes usar awk así:
$ ss -tupln | awk -v proto=tcp -v port=80 '$1 == proto && $5 ~ ":" port "$" {split($0, array, "\""); print array[2]}' apache2Puede 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