Đúng cách để có được danh sách các gói được cài đặt phù hợp với một mẫu?


11

Tôi đang trên hệ thống đang chạy một bản phân phối dựa trên Debian (khá gần đây-).

Tôi muốn tạo một danh sách đơn giản tất cả các gói được cài đặt phù hợp với một mẫu nhất định. Tôi có thể làm điều đó bằng cách, chạy, nói,

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

nhưng tôi nhận được các dòng tôi không quan tâm, ví dụ:

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

Listing...

Vì vậy, có lẽ tôi không nên sử dụng apt. Tôi có thể chạy truy vấn dpkg như vậy:

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

nhưng điều đó không giới hạn ở các gói cài đặt. tôi có thể sử dụng

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

Nhưng sau đó tôi cần phải thực hiện một loạt xử lý văn bản, và ai có thể tin tưởng những không gian đó, phải không?

Vì vậy, điểm mấu chốt: Cách đúng đắn để có được danh sách các gói được cài đặt phù hợp với một mẫu?


Lưu ý :

  • Điểm thưởng nếu nó có thể là một regrec thích hợp chứ không chỉ là một vỏ toàn cầu.
  • Phải phân tích văn bản có vẻ như là một giải pháp ít lý tưởng hơn; nếu đó là những gì bạn đề xuất, vui lòng tranh luận tại sao không có cách nào tốt hơn.

Câu trả lời:


8

aptitude hỗ trợ tìm kiếm trong số tất cả các gói được biết đến với các công cụ quản lý gói, được cài đặt hoặc bằng cách khác, sử dụng các biểu thức thông thường, không có đầu ra bên ngoài và có thể được cho biết cách định dạng đầu ra của nó:

aptitude search "linux-image-.*"

Để chỉ liệt kê các gói đã cài đặt:

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

Để chỉ liệt kê các tên gói được cài đặt khớp với biểu thức chính quy:

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

Tài liệu này bao gồm các mẫu tìm kiếm có sẵncác chỉ định định dạng đầu ra một cách chi tiết. Bạn cũng sẽ tìm thấy các ví dụ trên trang web này, ví dụ như có cách nào để sử dụng regrec với apt apt không? , regrec với aptitude phần 2Linux - hiển thị hoặc nâng cấp các bản cập nhật bảo mật chỉ sử dụng apt .


6

Đây là một cách tốt để lấy danh sách các gói đã cài đặt trên hệ thống dựa trên Debian:

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

Các dòng đầu ra dpkg -lcó thể được tin cậy là lành mạnh. Mẫu ^iisẽ khớp với các dòng của các gói đã cài đặt và Awk đơn giản sẽ trích xuất cột thứ hai, tên gói (cùng tên được sử dụng trong apt-get installcác lệnh). Tên gói không thể chứa khoảng trắng, vì vậy đây lại là một hoạt động an toàn.


Điều này hoạt động khi bạn muốn grep theo phiên bản. Các câu trả lời với aptitude searchapt listtrong trường hợp này không.
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

Nói về 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

Bạn cũng có thể sử dụng dpkg-queryvới -ftùy chọn (--showformat), khi được gọi mà không có bất kỳ tên gói nào, theo mặc định chỉ các gói đã cài đặt được liệt kê.

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

1

Để "bẫy" thuật ngữ tìm kiếm khi grep ping dpkg xuất ra, cần phải bao gồm cụm từ tìm kiếm như sau. " git " được sử dụng làm thuật ngữ tìm kiếm mẫu vật:

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

Các carat (^) ii tiếp theo (2) không gian thêm vào trước các tìm kiếm hạn đảm bảo không có gì TRƯỚC nó khác hơn là sự kết hợp của các nhân vật có thể phù hợp.

Việc [[:space:]]bỏ cụm từ tìm kiếm sẽ ngăn không cho các kết quả khớp một phần xảy ra bằng cách chỉ khớp các khoảng trắng ngay lập tức SAU .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.