Как я могу использовать для цикла в оболочке/терминале с awk?

Команда

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}'.

2
задан 16 October 2017 в 12:04

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... часть, как Вы в настоящее время делаете без любой фильтрации.

5
ответ дан 2 December 2019 в 01:56

Вы нашли это, когда Вы удалили $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 пакет.

0
ответ дан 2 December 2019 в 01:56

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

Похожие вопросы: