Поиск соответствия (регулярное выражение) и затем переформатирование вывода в Linux - PullRequest
1 голос
/ 06 марта 2019

Моя цель - поиск пакетов, которые начинаются (или состоят из) заданной строки, поскольку это невозможно с помощью команды pacman из Arch Linux.Самый простой подход для поиска пакетов - выполнить pacman -Sl |grep vivaldi, где vivaldi - это имя пакета, которое даст:

herecura vivaldi 2.3.1440.60-1 [installed]
herecura vivaldi-ffmpeg-codecs 71.0.3578.98-1 [installed]
herecura vivaldi-snapshot 2.4.1468.4-1

Легко, как есть, у него есть поток: он ищет заданныйимя пакета везде, но имя пакета всегда между первым и вторым пробелом.Очень простой обходной путь к следующему

pacman -Sl | grep -P "(?:[a-z0-9-]+) vivaldi"

Консоль покажет вывод, подобный приведенному ниже:

herecura vivaldi 2.3.1440.60-1 [installed]
herecura vivaldi-ffmpeg-codecs 71.0.3578.98-1 [installed]
herecura vivaldi-snapshot 2.4.1468.4-1

Это даст (возможно)правильный результат, который совпадает с приведенным выше.Но есть еще одна оговорка: я хотел бы переставить вывод в форму:

vivaldi 2.3.1440.60-1 [herecura] [installed] 
vivaldi-ffmpeg-codecs 71.0.3578.98-1 [herecura] [installed]
vivaldi-snapshot 2.4.1468.4-1 [herecura]

Я довольно близок к этому, выполнив команду:

pacman -Sl | grep -P "(?:[a-z0-9-]+) vivaldi" | awk '{print $2, $3, $4, $1}'

vivaldi 2.3.1440.60-1 [installed] herecura
vivaldi-ffmpeg-codecs 71.0.3578.98-1 [installed] herecura
vivaldi-snapshot 2.4.1468.4-1  herecura
vivaldi-snapshot-ffmpeg-codecs 72.0.3626.97-1  herecura

Однако это не очень хороший подход, так как он использует grep с awk, но awk будет достаточно, поскольку он также поддерживает регулярные выражения (например, см. Этот пост ).

Это все, что я получаю.К сожалению, я не могу объединить все, что я написал, в одну команду (я планирую написать псевдоним или функцию).

1 Ответ

1 голос
/ 06 марта 2019

Не могли бы вы попробовать следующее (если я правильно понял), так как вы упомянули, что строка будет находиться между 1-м и 2-м пробелом, так что тогда она станет 2-м полем строки. Теперь, если мы хотим проверить значение 2-го поля, я поставил условие для 2-го поля, чтобы проверить, является ли 2-е поле текущей строки vivaldi, затем выполните печать.

pacman -Sl | awk '$2~/vivaldi/{print $2, $3, $4, $1}'

В соответствии с комментарием OP, необходимо обернуть $1 в [ и ], поэтому добавим следующее.

pacman -Sl | awk '$2~/vivaldi/{print $2, $3, $4, "[" $1 "]"}'
...