Cara yang benar untuk mendapatkan daftar paket yang diinstal yang cocok dengan suatu pola?

11

Saya menggunakan sistem yang menjalankan distribusi berbasis Debian (cukup baru).

Saya ingin membuat daftar sederhana dari semua paket yang diinstal yang cocok dengan pola tertentu. Saya bisa melakukannya dengan, berlari, katakan,

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

tetapi saya mendapatkan garis yang tidak saya pedulikan, misalnya:

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

Listing...

Jadi mungkin saya sebaiknya tidak menggunakan apt. Saya dapat menjalankan dpkg-query seperti:

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

tapi itu tidak terbatas pada paket yang diinstal. Saya bisa menggunakan

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

tapi kemudian saya perlu melakukan banyak pemrosesan teks, dan siapa yang bisa mempercayai ruang-ruang itu, kan?

Jadi, intinya: Apa cara yang benar untuk mendapatkan daftar paket yang diinstal yang cocok dengan suatu pola?


Catatan :

  • Poin bonus jika itu bisa menjadi regexp yang tepat dan bukan hanya shell glob.
  • Harus mem-parsing teks sepertinya solusi yang kurang ideal; Jika itu yang Anda sarankan, berdebatlah mengapa tidak ada cara yang lebih baik.
einpoklum
sumber

Jawaban:

8

aptitude mendukung pencarian di antara semua paket yang dikenal dengan alat manajemen paket, diinstal atau sebaliknya, menggunakan ekspresi reguler, tanpa output yang asing, dan dapat diberitahu bagaimana memformat outputnya:

aptitude search "linux-image-.*"

Untuk daftar hanya paket yang diinstal:

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

Untuk mencantumkan hanya nama paket yang diinstal yang cocok dengan ekspresi reguler:

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

Dokumentasi mencakup pola pencarian yang tersedia dan penspesifikasi format output secara terperinci. Anda juga akan menemukan contoh di situs ini, misalnya apakah ada cara untuk menggunakan regexp dengan bakat? , regexp dengan aptitude part 2 , dan Linux - menampilkan atau meningkatkan pembaruan keamanan hanya menggunakan apt .

Stephen Kitt
sumber
6

Inilah salah satu cara yang baik untuk mendapatkan daftar paket yang diinstal pada sistem berbasis Debian:

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

Garis output dari dpkg -ldapat dipercaya menjadi waras. Pola ini ^iiakan cocok dengan garis paket yang diinstal, dan Awk sederhana akan mengekstrak kolom kedua, nama paket (nama yang sama yang digunakan dalam apt-get installperintah). Nama paket tidak boleh berisi spasi, jadi ini lagi operasi yang aman.

janos
sumber
Ini berfungsi ketika Anda ingin memahami berdasarkan versi. Jawaban dengan aptitude searchdan apt listdalam hal ini tidak.
Hi-Angel
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

Berbicara tentang regex:

$ 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

Anda juga dapat menggunakan dpkg-querydengan -f(--showformat) pilihan, yang ketika dijalankan tanpa nama paket, secara default paket hanya dipasang terdaftar.

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

Untuk "menjebak" istilah yang dicari saat grep ping keluaran dpkg , perlu membungkus istilah pencarian sebagai berikut. " git " digunakan sebagai istilah pencarian spesimen:

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

The karat (^) ii diikuti oleh (2) ruang mengawali dicari jangka memastikan tidak ada SEBELUM itu selain itu kombinasi karakter bisa cocok.

Batas [[:space:]]istilah yang dicari mencegah kecocokan parsial terjadi dengan hanya ruang yang cocok segera setelah itu.

F1Linux
sumber