Команда AWK возвращает 0 - PullRequest
       0

Команда AWK возвращает 0

0 голосов
/ 10 февраля 2020

При выполнении команды AWK со следующим кодом

awk -F: 'BEGIN{OFS=":"} ($2 != "*" && $2 != "!") {$2=system("openssl passwd -1 -salt {salt} {password}"); print $2}' PASS/shadow.txt > PASS/test.txt |  cat PASS/test.txt 

При печати команды я получу:

«Соленый пароль»
0

Это изменит $ 2 на 0. Но все равно распечатайте ха sh. Есть ли в любом случае это исправить и иметь 2 = вывод команды.

Я пытаюсь заменить все поля $ 2 новым паролем ha sh в качестве примера проекта в моем классе и сохранить результат в новом файле.

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

Похоже, это то, что вы пытаетесь сделать:

awk '
    BEGIN { FS=OFS=":" }
    $2 !~ /^[*!]$/ {
        cmd = "openssl passwd -1 -salt {salt} {password}"
        if ( (cmd | getline line) > 0 ) {
            $2 = line
        }
        close(cmd)
    }
    { print }
' PASS/shadow.txt > PASS/test.txt

Если нет, то отредактируйте свой вопрос, чтобы уточнить ваши требования и привести лучший пример.

0 голосов
/ 11 февраля 2020

Используемая вами команда system не выполняет то, что вы ожидаете. Он возвращает код возврата команды, которую вы выполняете, а не стандартный вывод.

system(expression): Выполните команду, заданную expression, способом, эквивалентным system() функция, определенная в объеме системных интерфейсов POSIX.1-2017 и возвращающая статус выхода команды.

Это легко увидеть с помощью следующего:

$ awk 'BEGIN{print system("true"), system("false")}'
0 1

Здесь мы представили команды true и false (см. man true и man false) о том, что они делают.

Если вы хотите захватить выходные данные команды, getline команда это то, что вам нужно. Подробный документ о том, что можно и что нельзя делать getline можно найти в Ed Morton's All about getline . Также см. его ответ для реализации этого OP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...