Есть ли способ использовать команды оболочки Linux внутри awk?
Мне нужно проверить существование пользователя из текстового файла (заданного как)
имя пользователя username@emai.com
и записать тех, кто не является существующим пользователем в новый текстовый файл как
username password username@email.com
В настоящее время у меня есть это:
#!/bin/bash
awk '{
for(i=1; i<=NF; i+=2) {
pass='pwgen'
if(id -u $i | awk '{$1}' > 999) print $1;
else $i pass $i,'@email.com' >> newusers.txt
}
}' $*
Я думаю, что это должно работать, но, очевидно, это не так. Она должна создать новый пароль, используя псевдоним pwgen (который создает 1 пароль на одно использование), проверить, является ли элемент $i в текстовом файле существующим пользователем, сравнив результат команды id -u $i | awk '{$1}' с 999, и если он не больше 999, она должна добавить имя пользователя пароль username@email.com
в текстовый файл с именем newusers.txt.
Ваш сценарий awk it
{ for(i=1; i<=NF; i+=2) { pass=pwgen if(id -u $i | awk {ARG1} > 999) print $1; else $i pass $i,@email.com >> newusers.txt } }
где ARG1
- это первый аргумент, переданный сценарию оболочки. Первая одинарная кавычка в вашем сценарии оболочки начинается с литерала в одинарных кавычках, который заканчивается второй одинарной кавычкой, то есть после | awk {
. Третья одинарная кавычка начинает другой литерал, заключенный в одинарные кавычки, который заканчивается четвертой одинарной кавычкой и т. Д. Если вы хотите включить одинарную кавычку, вам нужно заключить ее в кавычки. Но здесь в любом случае вам не нужна одиночная кавычка в сценарии awk. Строку в awk нужно писать в двойных кавычках.
pass = pwgen
Эта строка кода awk устанавливает переменную pass
в значение переменной pwgen
. Поскольку pwgen
не установлен, проход
устанавливается на пустое значение.
Вы, вероятно, хотели написать pass = `pwgen`
, который является синтаксисом оболочки для установки переменной оболочки pass
в вывод команды pwgen
. Но это синтаксис оболочки, а не awk, поэтому неудивительно, что он не работает в awk. Вы можете прочитать вывод команды в awk с синтаксисом канала:
pwgen | getline pass;
close("pwgen");
Вам необходимо закрыть канал, иначе при следующем выполнении инструкция будет читать из того же канала вместо запуска нового экземпляра pwgen
.
if (id -u $ i | awk '{$ 1}'> 999) print $ 1;
Вы можете использовать системную функцию
для выполнения команды оболочки. Написанная вами встроенная команда awk не имеет смысла.Я подозреваю, что вы хотели проверить, не превышает ли вывод id -u
999; это будет
if (system("id -u " $i "| awk \x27{exit(!($0 > 999))}\x27"))
\ x27
- это способ поместить символ одинарной кавычки внутри строки awk. Но это действительно сложно. Вместо этого прочтите вывод id -u
в сценарий awk.
id_command = "id -u " $i;
id_command | getline id;
close(id_command);
if (id > 999) print id;
else $ i pass (скрыто) >> newusers.txt
Я думаю, вы хотели записать строку в файл. Итак, вам нужна команда печати. Чтобы поставить пробел между элементами, передайте их как отдельные аргументы в print
. Чтобы соединить две строки без пробелов, поместите строки рядом друг с другом в сценарии awk без оператора между ними (в awk двоичный оператор null означает конкатенацию). И, как мы уже несколько раз видели, заключите строки в двойные кавычки.
else print $i, pass, $i "@email.com" >>"newusers.txt"
Могут быть и другие проблемы с вашим скриптом, я не изучил его полностью.