LINUX.ORG.RU

Вопрос по sh скрипту.


0

1

Есть файлик с мейлами

mail.tmp

alex@mail.ru

vlad@list.ru

Нужно из него получить файл вида

alex@mail.ru /home/mail/mail.ru/alex

vlad@list.ru /home/mail/list.ru/vlad

Пишу скриптик

#!/bin/sh

cat mail.tmp | while read line

do

USER=`awk -F@ '{print $1}'`

DOMAIN=`awk -F@ '{print $2}'`

# echo $DOMAIN

echo $line /usr/local/$DOMAIN/$USER

done

Почему то затыкается на первом юзере. Если в цикле не определять переменные, то все ок, только и адреса подставить не получается.

★★★★★

Последнее исправление: Slack (всего исправлений: 3)

$ cat 1

alex@mail.ru
vlad@list.ru

$ sed -r 's/(.+)@(.+)/\0 \/home\/mail\/\2\/\1/' 1.txt

alex@mail.ru /home/mail/mail.ru/alex
vlad@list.ru /home/mail/list.ru/vlad

uzbl
()

Видимо awk ждет ввода, чтобы его распарсить

USER=`awk -F@ '{print $1}'`

попробуй

USER=$(echo $line | awk -F@ '{print $1}')

Yur4eg ★★
()

cat mail.tmp | while read s; do echo $s «/home/mail/${s%@*}/${s#*@}»; done

alex@mail.ru /home/mail/alex/mail.ru
vlad@list.ru /home/mail/vlad/list.ru

AnDoR ★★★★★
()
Ответ на: комментарий от Yur4eg

На awk правильно писать так:

$ awk -F@ '{print $0" /home/mail/«$2»/«$1}' 1.txt

alex@mail.ru /home/mail/mail.ru/alex
vlad@list.ru /home/mail/list.ru/vlad

uzbl
()
Ответ на: комментарий от AnDoR

От спасибо, заработало, я правда до конца не понял, почему так, но все равно спасибо.

Slack ★★★★★
() автор топика

awk -F@ '{print $0" /usr/local/«$2»/«$1}' mail.txt

AITap ★★★★★
()
Ответ на: комментарий от uzbl

Ну вот, опередил. Староват стал, слишком долго вспоминаю регулярки :)

AlexVR ★★★★★
()
Ответ на: комментарий от AnDoR

andor@cision ~/tmp $ echo --help
--help
andor@cision ~/tmp $ /bin/echo --help
Использование: /bin/echo [КОРОТКИЙ-КЛЮЧ]... [СТРОКА]...
или: /bin/echo ДЛИННЫЙ-КЛЮЧ
Печатает СТРОКУ(СТРОКИ) на стандартный вывод.

-n не печатать завершающий перевод строки
-e интерпретировать управляющие последовательности
-E не интерпретировать управляющие последовательности
(по умолчанию)
--help показать эту справку и выйти
--version показать информацию о версии и выйти


Если действует ключ -e, распознаются следующие последовательности:

\\ обратная косая черта
\a звуковой сигнал (BEL)
\b забой
\c подавить дальнейший вывод
\e экранирование (escape)
\f новая страница
\n новая строка
\r возврат каретки
\t горизонтальная табуляция
\v вертикальная табуляция
\0NNN байт с восьмеричным значением ННН (от 1 до 3 цифр)
\xHH байт с шестнадцатеричным значением HH (от 1 до 2 цифр)

ЗАМЕЧАНИЕ: ваша оболочка может предоставлять свою версию echo, которая
обычно перекрывает версию, описанную здесь. Пожалуйста, обращайтесь к
документации по вашей оболочке, чтобы узнать, какие ключи она
поддерживает.

Об ошибках в echo сообщайте по адресу bug-coreutils@gnu.org.
Домашняя страница GNU coreutils: <http://www.gnu.org/software/coreutils/>
Справка по работе с программами GNU: <http://www.gnu.org/gethelp/>
Об ошибках в переводе echo сообщений по адресу <gnu@mx.ru>
Полная документация доступна по команде: info coreutils 'echo invocation'

AnDoR ★★★★★
()
Ответ на: комментарий от AnDoR

Еще один вопрос. Файл

mail: alex@list.ru
MailAlternateAddress: alex@lst103.b.ls1.ru
mail: user11@list.ru
MailAlternateAddress: user12@gmail.com
MailAlternateAddress: user13@yandex.ru

Надо к виду

alex@list.ru  alex@lst103.b.ls1.ru
user11@list.ru user12@gmail.com user13@yandex.ru

Чот к концу дня не понимаю совсем как порезать.

Slack ★★★★★
() автор топика
Ответ на: комментарий от Slack

paste -d ' ' --serial | sed 's/mail: /\n/g; s/MailAlternateAddress: //g'

Не самый эффективный, наверное, способ, но работает. Ну и первую пустую строку обрезать.

Yareg ★★★
()
Ответ на: комментарий от anonymous

# sed -r 's,(.+)@(.+),\0 /home/mail/\2/\1,' mail.tmp

alex@mail.ru /home/mail/mail.ru/alex

vlad@list.ru /home/mail/list.ru/vlad

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.