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

11

Estoy en el sistema ejecutando una distribución (bastante reciente) basada en Debian.

Me gustaría generar una lista simple de todos los paquetes instalados que coinciden con un cierto patrón. Puedo hacer eso, corriendo, 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 lo 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 tendría que hacer un montón de procesamiento de texto, y ¿quién puede confiar en esos espacios, verdad?

En resumen, ¿cuál es la 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 concha.
  • Tener que analizar el texto parece una solución menos que ideal; si eso es lo que sugiere, discuta por qué no hay una mejor manera.
einpoklum
fuente

Respuestas:

8

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

aptitude search "linux-image-.*"

Para enumerar solo los paquetes instalados:

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

Para enumerar solo los nombres de paquetes instalados que coinciden con la expresión regular:

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

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

Stephen Kitt
fuente
6

Aquí hay una buena manera de obtener la lista de paquetes instalados en un sistema basado en Debian:

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

Se dpkg -lpuede confiar en que las líneas de salida son cuerdas. El patrón ^iicoincidirá 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 los apt-get installcomandos). Los nombres de los paquetes no pueden contener espacios en blanco, por lo que esto es una operación segura.

janos
fuente
Esto funciona cuando quieres grep por versión. Las respuestas con aptitude searchy apt listen este caso no.
Hola Ángel
6
$ 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 se puede usar dpkg-querycon -fla opción (--showformat), que si se ejecuta sin nombre del paquete, por defecto se enumeran únicamente los paquetes instalados.

$ dpkg-query -f '${Package}\n' -W |grep 'linux-image' #-W == --show
George Vasiliou
fuente
1

Para "atrapar" el término buscado cuando grep ping dpkg , necesita encerrar el término de búsqueda de la siguiente manera. " git " se usa como el término de búsqueda de muestras:

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

El quilate (^) ii seguido de (2) espacios que anteceden el término buscado no garantiza nada ANTES que no sea que la combinación de caracteres puede coincidir.

El [[:space:]]colindante con el término buscado impide que se produzcan coincidencias parciales solo al hacer coincidir los espacios inmediatamente DESPUÉS .

F1Linux
fuente