es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eres un traductor al español que traduce documentos de tecnología de la información. Traduce lo siguiente al español. Descarta cualquier carácter que no sea una letra real. usando awk – Bash.

Entonces tengo un script que busca si mi servicio “vmxd.service” existe y verifica su estado actual, “cargado”, “ejecutándose”, “activo”…

Utilizo el siguiente script para ese caso:

systemctl --all --type service | awk -v pat="$SERVICE" '$0 ~ pat {print $0}'

● vmxd.service cargado fallido fallido Juniper vMX Router

Ten en cuenta que “$SERVICE” es “vmxd.service”

El problema es que en algunos servidores, ese [●] no está presente, así que deduje que al imprimir la primera palabra {print $1} haría el truco de tomar el nombre.

Cuando revisé mi script en otro host, ahora en lugar de imprimir “vmxd.service” como era el primer carácter en la cadena, ahora está imprimiendo [●] y rompe completamente mi script.

Aquí tienes una salida de mi script mostrando el [●]:

[...]
Se encontró el archivo de servicio: vmxd.service en /etc/systemd/system/
Verificar si la ruta de WorkingDirectory es correcta... [OK]
Verificar si el servicio existe... [Encontrado]
Verificar si ● está cargado... [No]
Verificar si ● está activo... [No]
Habilitando el servicio... /init.sh: línea 189: comando no encontrado
Recargando el servicio... [No]
Verificar si 'vmxd.service' se ha iniciado correctamente... [Iniciado]

¿Existe alguna solución alternativa para este problema? ¿Hay alguna forma de ignorar si se detecta el [●] sin alterar el {print $1}? Al imprimir $1 debería mostrar “vmxd.service” sin importar nada más.

Normalmente la salida en los servidores donde mi script funciona es como:

vmxd.service                                          cargado    activo   finalizado  Juniper vMX Router

sin el [●].

Nota: No tengo mucha idea de lo que realmente significa ese punto, pero independientemente de eso, solo necesito ignorar ese carácter de mi variable al ejecutar el comando.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una posible solución alternativa para este problema es modificar el comando awk para buscar específicamente la cadena “loaded” en lugar de confiar en la presencia del carácter [●]. Esto se puede hacer añadiendo una coincidencia adicional de patrones al script awk:

    systemctl --all --type service | awk -v pat="$SERVICE" '$0 ~ pat && $2 == "loaded" {print $1}'
    

    Esto solo imprimirá la primera columna si la segunda columna contiene la cadena “loaded”, ignorando cualquier carácter [●] u otros indicadores de estado que puedan estar presentes.

    Alternativamente, si aún desea imprimir toda la línea pero ignorar el carácter [●], puede modificar el comando awk para reemplazar cualquier aparición de [●] con una cadena vacía antes de imprimir:

    systemctl --all --type service | awk -v pat="$SERVICE" '{ gsub(/\[●\]/,""); } $0 ~ pat {print $1}'
    

    Esto utiliza la función gsub() para reemplazar globalmente cualquier instancia de [●] por una cadena vacía antes de imprimir la primera columna.

Comments are closed.