Здравствуйте, я пытаюсь сделать что-то подобное, но это не сработает, вы можете мне помочь, ребята?
/usr/bin/mysql -B -r -h ******** -u******* -p****** -D***** \
-e'SELECT `username`, `uid`, `gid`, `homedir` FROM `some_table`)' | \
awk '{print $1":x:"$2":"$3"::"$4":/usr/sbin/nologin"}' >> /tmp/file1 ;
awk '{print $1":"$5":13753:0:99999:7:::"}'>>/tmp/file2
Изменение ";" to "&&" тоже не работает. Оба файла file1 и file2 созданы, но только file1 содержит данные. В основном я хочу использовать одни и те же переменные для двух команд.
Попробуй это:
/usr/bin/mysql -B -r -h ******** -u******* -p****** -D***** \
-e'SELECT `username`, `uid`, `gid`, `homedir` FROM `some_table`)' | \
awk '{ print $1":x:"$2":"$3"::"$4":/usr/sbin/nologin" >> "/tmp/file1";
print $1":"$5":13753:0:99999:7:::" >> "/tmp/file2" }'
Если вы хотите запустить две разные команды с одними и теми же данными входящего канала, вам необходимо использовать промежуточный файл:
TMPFILE="$(mktemp)"
/usr/bin/mysql -B -r -h ******** -u******* -p****** -D***** \
-e'SELECT `username`, `uid`, `gid`, `homedir` FROM `some_table`)' >"$TMPFILE"
awk '{print $1":x:"$2":"$3"::"$4":/usr/sbin/nologin"}' <"$TMPFILE" >>/tmp/file1
awk '{print $1":"$5":13753:0:99999:7:::"}' <"$TMPFILE" >>/tmp/file2
rm -f "$TMPFILE"
Но, как кванты пишет, вы можете спросить один awk
экземпляр для выполнения обеих операций.
Вы натворили беспорядок, начиная с форматирования вашего вопроса (посмотрите, что я сделал выше, что должно прояснить ситуацию ниже).
Первая проблема:
Если у вас есть точка с запятой (;
) или "продолжение успеха (&&
) вы выполняете два отдельных набора команд.
Полностью отдельный. Это как если бы вы запустили один, нажали ввод, а затем запустили другой.
Это означает ваш второй awk
смотрит на стандартный ввод для ввода и не находит ничего, что не дает вам вывода (вот почему file2
пусто)
Вторая проблема:
Отдельные экземпляры awk
не может делиться переменными. Либо ты хочешь второй awk
пережевывать вывод MySQL-запроса, или вы хотите, чтобы он пережевал вывод первого awk
.
Поскольку у вас есть 5 переменных во втором awk
Я предполагаю последнее.
Решение
Запустите первую половину списка команд (все до точки с запятой).
Теперь запустите второй awk и укажите входной файл (awk '{print $1":"$5":13753:0:99999:7:::"}' /tmp/file1 >> /tmp/file2
).
Ваша команда, как показано, никогда не будет работать, так как обработка полностью последовательна, а вывод mysql уже израсходован первым оператором awk.
Я бы просто перенес все это в крошечный сценарий bash:
#!/bin/bash
mycmd="SELECT `username`, `uid`, `gid`, `homedir` FROM `some_table`"
while read -r username, uid, gid, homedir; do
printf "%s:x:%s:%s::%s:/usr/sbin/nologin" "$username" "$uid" "$gid" "$homedir" >> /tmp/file1
printf "%s:%s:13753:0:99999:7:::" "$username" "missing variable" >>/tmp/file2
done <(/usr/bin/mysql -B -r -h * -u* -p* -D* -e "$mycmd")
Не проверено, посетите Wooledge Wiki для большего количества магии bash, чем вы думали :)