Как я могу использовать для цикла в оболочке / терминале с 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

EDIT Сделал синтаксическую ошибку самостоятельно. Я должен был использовать ту же самую команду, удалив $2=="ufw". Ответ: dpkg -l | awk '{sub("ubuntu[^[:alpha:]]*$", "", $3); print $3"\t"$2}'.

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

1 ответ

Вы обнаружили, что когда вы удалили $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.

0
ответ дан 23 May 2018 в 02:17

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

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