Назад | Перейти на главную страницу

двойные команды awk в одном канале?

Здравствуйте, я пытаюсь сделать что-то подобное, но это не сработает, вы можете мне помочь, ребята?

/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, чем вы думали :)