Можно ли использовать вложенную команду grep?

Я имею в виду, когда я бегу

dpkg -s thunar | grep "Depends"

он отображает все зависимости для файлового менеджера thunar. Как запустить, например

dpkg -s thunar | grep "Depends" | grep "gtk"

отображать только зависимости, содержащие в своем имени gtk?

4 ответа

Решение
$ dpkg -s nautilus | grep "Depends" | grep -o "\S*gtk\S*"
libgtk-3-0

Объяснение:

  • -o - Печать только соответствующей части строки
  • \S* - Ноль или более непробельных символов

Если вы хотите номер версии тоже:

$ dpkg -s nautilus | grep "Depends" | grep -o "\S*gtk[^,]*"
libgtk-3-0 (>= 3.9.12)
  • [^,]* - Ноль или более символов, которые не являются запятыми

Я бы разбил пакеты на отдельные строки, чтобы grepпед с tr:

$ dpkg -s vivaldi-stable | grep "^Depends" | tr ',' '\n' | grep "gtk"
 libgtk-3-0 (>= 3.21.4)

То, как вы печатаете свой пример, также должно работать, но вы можете сделать...

dpkg -s thunar | grep 'Depends.*gtk'

... если gtk всегда после Зависит

Пример:

$ dpkg -s nautilus | grep -E 'Depends.*gtk'
Depends: libatk1.0-0 (>= 1.32.0), libc6 (>= 2.14), libcairo-gobject2 (>= 1.10.0), libcairo2 (>= 1.14.0), libdbusmenu-glib4 (>= 0.4.2), libexempi3 (>= 2.4.0), libexif12 (>= 0.6.21-1~), libgail-3-0 (>= 3.0.0), libgdk-pixbuf2.0-0 (>= 2.25.2), libglib2.0-0 (>= 2.51.2), libgnome-autoar-0-0 (>= 0.2.1), libgnome-desktop-3-17 (>= 3.18.1), libgtk-3-0 (>= 3.22.6), libnautilus-extension1a (= 1:3.26.4-0ubuntu7), libpango-1.0-0 (>= 1.20.0), libpangocairo-1.0-0 (>= 1.14.0), libselinux1 (>= 2.0), libtracker-sparql-2.0-0 (>= 0.10.0), libunity9 (>= 3.4.6), libx11-6, libzeitgeist-2.0-0 (>= 0.9.9), nautilus-data (= 1:3.26.4-0ubuntu7), shared-mime-info (>= 0.50), desktop-file-utils (>= 0.7), gvfs (>= 1.3.2), libglib2.0-data, gsettings-desktop-schemas (>= 3.8.0)

grep имеет дело со строками, поэтому после начального совпадения для Depends линия, вам нужно как-то разбить линию. Это может быть сделано с grep -Po флаги, но это может быть немного сложным. Более простой способ и только через один конвейер заключается в использовании awk:

$ dpkg -s nautilus | awk '/Depends/{for(i=1;i<=NF;i++) {if($i~/gtk/) printf "%s\n",$i;}}'
libgtk-3-0
$ dpkg -s gedit | awk '/Depends/{for(i=1;i<=NF;i++) {if($i~/gtk/) printf "%s\n",$i;}}'
libgtk-3-0
libgtksourceview-3.0-1
gir1.2-gtk-3.0
gir1.2-gtksource-3.0

Это соответствует соответствующей строке и перебирает каждый "поле" или разделенный пробелом столбец в строке, проверяя, содержит ли он gtk,

Другие вопросы по тегам