Команда
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
Править
Сделанный синтаксической ошибкой самостоятельно. Я должен был непосредственно использовать ту же команду, удаляя $2=="ufw"
. Ответ dpkg -l | awk '{sub("ubuntu[^[:alpha:]]*$", "", $3); print $3"\t"$2}'
.
Можно сказать dpkg
перечислять детали для определенных пакетов:
$ dpkg -l util-linux ufw
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-============================================-===========================-===========================-==============================================================================================
ii ufw 0.35-0ubuntu2 all program for managing a Netfilter firewall
ii util-linux 2.27.1-6ubuntu3.1 amd64 miscellaneous system utilities
Затем только необходимо отфильтровать заголовок.
Легче все еще должен был бы использовать dpkg-query
и установить формат непосредственно:
$ dpkg-query -W --showformat '${Version}\t${Package}\n' util-linux ufw
0.35-0ubuntu2 ufw
2.27.1-6ubuntu3.1 util-linux
Затем в awk
, просто необходимо удалить ubuntu...
часть, как Вы в настоящее время делаете без любой фильтрации.
Вы нашли это, когда Вы удалили $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
распечатать информацию об установленных пакетах с пользовательским форматированием. ответ muru является лучшим способом сделать определенную задачу, которую Вы пытаетесь сделать здесь.
Этот ответ объясняет, почему это было это $2=="ufw"
предотвращенный awk
от обработки каждой строки входа, поскольку Вы предназначили.
Как в Руководстве пользователя Awk GNU говорится, сценарий AWK состоит из правил, которые указывают шаблон и в изогнутом {
}
фигурные скобки, меры, которые должны быть приняты, когда тот шаблон подобран.
pattern { action }
Когда шаблон опущен, действие выполняется для каждой строки входа. На практике это - наиболее распространенный способ записать правило AWK.
{ action }
Это также, что Вы предназначили: Вы хотели воздействовать на и продолжить линию вывода для каждой строки входа.
{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
пакет.