Внешние команды в AWK

Есть ли способ использовать команды оболочки 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.

0
15.03.2017, 01:39
1 ответ

Ваш сценарий 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"

Могут быть и другие проблемы с вашим скриптом, я не изучил его полностью.

2
28.01.2020, 02:34

Теги

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