Команда
dpkg -l | awk '$2=="ufw" {sub("ubuntu[^[:alpha:]]*$", "", $3); print $3"\t"$2}'
выводит:
0.34~rc-0 ufw
Теперь вместо указания имени пакета, такого как $2=="ufw", я хочу перебрать и получить список всех пакетов например:
2.20.1-5.1 util-linux
1.0.2-1 zerofree
0.34~rc-0 ufw
EDIT Сделал синтаксическую ошибку самостоятельно. Я должен был использовать ту же самую команду, удалив $2=="ufw". Ответ: dpkg -l | awk '{sub("ubuntu[^[:alpha:]]*$", "", $3); print $3"\t"$2}'.
Вы обнаружили, что когда вы удалили $2=="ufw" с начала вашего AWK-скрипта $2=="ufw" {sub("ubuntu[^[:alpha:]]*$", "", $3); print $3"\t"$2}, вы получили нужный вам результат. То есть вы сообщили, что эта команда работала:
dpkg -l | awk '{sub("ubuntu[^[:alpha:]]*$", "", $3); print $3"\t"$2}'
Вы действительно должны использовать dpkg-query для печати информации об установленных пакетах с пользовательским форматированием. Ответ муру - лучший способ выполнить конкретную задачу, которую вы пытаетесь сделать здесь.
В этом ответе объясняется, почему $2=="ufw" помешало awk обрабатывать каждую строку ввода, как вы предполагали. [ ! d6]
Поскольку удален , сценарий AWK состоит из правил, которые определяют шаблон и в фигурных скобках { } действие, которое должно быть выполнено
pattern { action }
Когда шаблон опущен, действие выполняется для каждой строки ввода. На практике это самый распространенный способ написания правила AWK.
{ action }
Это то, что вы намеревались: вы хотели работать и создавать линию вывода для каждой строки ввода. [ ! d11]
{sub("ubuntu[^[:alpha:]]*$", "", $3); print $3"\t"$2}
Но у вас также был указан шаблон:
$2=="ufw" {sub("ubuntu[^[:alpha:]]*$", "", $3); print $3"\t"$2}
Это заставило ваше действие применяться только к тем строкам, второе поле которых ($2) было равно ( ==) на ufw ("ufw"). Но есть только один пакет, имя которого точно ufw, и, таким образом, только одна строка о нем выводится на dpkg -l.
Удаление шаблона вызвало действие, которое должно выполняться для всех строк ввода , а не только одну строку о пакете ufw.