Можно ли использовать вложенную команду 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
,