Используя awk для добавления текста в конец строки в / etc / group

Я пишу скрипт для автоматизации некоторых задач, и мне нужно добавить пользователя в группу в / etc / group. Я пытаюсь использовать эту команду:

sudo bash -c "awk '{if (/^moli/) {$0=$0"$uservar,"}; print' /etc/group > /etc/group"

Проблема, с которой я столкнулся, - это

awk: cmd. line:1: {if (/^moli/) {-bash=-bashtestuser1,}; print
awk: cmd. line:1:                     ^ syntax error
awk: cmd. line:1: {if (/^moli/) {-bash=-bashtestuser1,}; print
awk: cmd. line:1:                                             ^ unexpected newline or end of string

Если я изменю '' до "" Я получаю: -bash: синтаксическая ошибка рядом с неожиданным токеном '('

0
задан 7 June 2021 в 21:17

1 ответ

В вашем небольшом коде много проблем:

  • Одиночные кавычки внутри двойных кавычек не препятствуют подстановке переменных.
    Итак, $ 0 заменяется на / bin / bash . См. здесь .

  • Вам действительно повезло, что ваша команда не удалась !! Если бы он работал, он бы очистил ваш файл / etc / group , и у вас были бы серьезные проблемы.
    В тот момент, когда вы вводите command> file , файл открывается и очищается для записи, а ваша команда будет видеть пустую файл.

    Лучше использовать > file.temp && mv file.temp file или awk -i inplace ... .

  • Вместо добавления переменных bash непосредственно в код awk используйте параметр awk -v var = $ var и используйте внутри var awk .


Итак, что делать?

Вам не нужен этот адский дубликат цитирования, вы можете просто использовать:

sudo awk -i inplace '...' file

или

awk '...' file | sudo tee file.temp && sudo mv file.temp file

или, в вашем случае, более подходящий sed :

sudo sed -i '...' file

Однако вам вообще не следует изменять / etc / group вручную.

Добавьте пользователя с помощью usermod (как предлагается здесь ):

sudo usermod -a -G groupName userName
1
ответ дан 28 July 2021 в 11:31

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

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