¿Forma correcta de obtener la lista de paquetes instalados que coinciden con un patrón?

Estoy en un sistema que ejecuta una distribución basada en Debian (bastante reciente).

Me gustaría generar una lista de todos los paquetes instalados que coinciden con un patrón determinado. Puedo hacerlo ejecutando, digamos,

apt list --installed "linux-image-*" | cut -d/ -f1 

pero obtengo líneas que no me interesan, por ejemplo:

WARNING: apt does not have a stable CLI interface. Use with caution in scripts. Listing... 

Entonces, tal vez sea mejor que no use apt. Puedo ejecutar dpkg-query así:

dpkg-query --showformat="${Package}\n" --show "linux-image*" 

pero eso «no se limita a los paquetes instalados. Podría usar

dpkg-query --list "linux-image-*" | grep "ii" 

pero luego necesitaría hacer un montón de procesamiento de texto, y ¿quién puede confiar en esos espacios, verdad?

Entonces, en resumen: ¿Cuál es el ¿forma correcta de obtener la lista de paquetes instalados que coinciden con un patrón?


Nota :

  • Puntos de bonificación si puede ser una expresión regular adecuada en lugar de solo un globo de shell.
  • Tener que analizar el texto parece una solución menos que ideal; si eso es lo que sugiere, por favor discuta por qué no hay una mejor manera.

Respuesta

aptitude admite la búsqueda entre todos los paquetes conocidos por las herramientas de administración de paquetes, instalados o no, utilizando expresiones regulares , sin salida extraña, y se le puede decir cómo formatear su salida:

Para enumerar solo los paquetes instalados:

aptitude search "linux-image-.* ~i" 

Para enumerar solo los nombres que coincida con la expresión regular:

aptitude search "linux-image-.* ~i" -F "%p" 

La documentación cubre los patrones de búsqueda disponibles y especificadores de formato de salida en detalle. También encontrará ejemplos en este sitio, por ejemplo, ¿hay alguna forma de usar regexp con aptitude? , regexp con aptitude part 2 , y Linux: muestra o actualiza las actualizaciones de seguridad solo con apt .

Respuesta

$ apt list --installed "linux-image-*" 2>/dev/null |awk -F"/" "NR>1{print $1}" linux-image-3.16.0-4-amd64 linux-image-4.11.0-1-amd64 linux-image-4.12.0-1-amd64 linux-image-4.13.0-1-amd64 linux-image-4.8.0-2-amd64 linux-image-4.9.0-1-amd64 linux-image-4.9.0-2-amd64 linux-image-4.9.0-3-amd64 

Hablando de expresiones regulares:

$ apt list --installed "linux-image-*" 2>/dev/null |awk -F"/" "NR>1 && $0~/4.1/{print $1}" linux-image-4.11.0-1-amd64 linux-image-4.12.0-1-amd64 linux-image-4.13.0-1-amd64 

También puede usar dpkg-query con la opción -f (–showformat), que cuando se invoca sin ningún nombre de paquete, de forma predeterminada solo se instalan los paquetes se enumeran.

$ dpkg-query -f "${Package}\n" -W |grep "linux-image" #-W == --show 

Comentarios

  • " agregar |awk -F'/' 'NR>1{print $1}' al comando de lista de apt " es la respuesta más corta posible para " solo nombres de lista de apt "

Responder

Esta es una buena forma de consigue la lista de en paquetes estancados en un sistema basado en Debian:

dpkg -l | grep ^ii | awk "{print $2}" 

Se puede confiar en que las líneas de salida de dpkg -l están cuerdas . El patrón ^ii coincidirá con las líneas de los paquetes instalados, y el Awk simple extraerá la segunda columna, los nombres de los paquetes (los mismos nombres utilizados en apt-get install comandos). Los nombres de los paquetes no pueden contener espacios en blanco, por lo que nuevamente esta es una operación segura.

Comentarios

  • Esto funciona cuando desea grep por versión. Las respuestas con aptitude search y apt list en este caso no ' t.

Responder

Para «atrapar» el término buscado cuando grep ping dpkg salida, es necesario encerrar el término de búsqueda de la siguiente manera. « git » se utiliza como término de búsqueda de muestras:

dpkg -l |grep "^ii git[[:space:]]" 

El quilate (^) ii seguido de (2) espacios antes del término buscado no garantiza nada ANTES de puede coincidir con una combinación de caracteres distinta.

El [[:space:]] contiguo al término buscado evita que se produzcan coincidencias parciales al coincidir solo los espacios inmediatamente DESPUÉS .

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *