LINUX.ORG.RU

Помогите исправить и оптимизировать скрипт


0

0
Здравствуйте!
Есть почти скрипт, он должен обрабатывать каждую строку из файла по отдельности, в моём случае это email адреса:

#!/bin/bash
#выдёргиваем адреса из адресной книги
grep -E -o -h "[a-zA-Z0123456789=_-]+@([a-zA-Z0123456789=_-]+\.)+[a-zA-Z0123456789=_-]{2,3}" ~/.kde4/share/apps/kabc/std.vcf | uniq | cat -n | expand > abc
#цикл поочереди дожен выдёргивать строки из сделанного файла
i=1 #первая строка имеет номер 1
until [ "$i" -eq 5 ] #всего у нас 4 адреса
do
#выдёргиваем первую строку и выводим её в файл
grep -E -o -h $i+' '+'[a-zA-Z0123456789=_-]+@([a-zA-Z0123456789=_-]+\.)+[a-zA-Z0123456789=_-]{2,3} ' abc | grep -E -o -h '[a-zA-Z0123456789=_-]+@([a-zA-Z0123456789=_-]+\.)+[a-zA-Z0123456789=_-]{2,3}' > abctmp
#отображаем выдернутую строку
cat abctmp
#
#сюда я вставлю потом скрипт отправки сообщения на выдернутый адрес из первой строки
#
#переходим на вторую строку
let "i += 1"
done
#удаляем результат жизнедеятельности
rm -f abctmp
rm -f abc
exit

Я хотел бы, чтобы когда в цикле выдёргивается строка с адресом, она помещалась в переменную, а не в файл.
Может кто-нибудь сможет упростить код или предложить альтернативу некоторым сложным конструкциям?

> grep -E -o -h "[a-zA-Z0123456789=_-]+@([a-zA-Z0123456789=_-]+\.)+[a-zA-Z0123456789=_-]{2,3}" ~/.kde4/share/apps/kabc/std.vcf | uniq | cat -n | expand > abc

> Я хотел бы, чтобы когда в цикле выдёргивается строка с адресом, она помещалась в переменную, а не в файл.

$(...) уже не работает?

dilmah ★★★★★
()
для начала что-то вроде:
grep -E -o -h "([a-zA-Z0-9=_-])+@(\1+\.)+\1{2,3}" ~/.kde4/share/apps/kabc/std.vcf | uniq | cat -n | expand

потом:

вместо until [ "$i" -eq 5 ] универсальней сделать while read str; do, где str - имя переменной, в которую будет писаться очередная строка
AnDoR ★★★★★
()
Ответ на: комментарий от AnDoR
вообще если я правильно понял, то тебе надо:

grep -E -o -h "([a-zA-Z0-9=_-])+@(\1+\.)+\1{2,3}" ~/.kde4/share/apps/kabc/std.vcf | uniq | while read s; do i=$((i+1)); echo "$i $s"; done
AnDoR ★★★★★
()
Ответ на: комментарий от AnDoR
grep -E -o -h "([a-zA-Z0-9=_-])+@(\1+\.)+\1{2,3}" так не работает

$(...) не работает

пробовал также: show=(...) show='...' let "show = ..."

ничё не пойму, почему не работает

ants
() автор топика
Ответ на: комментарий от ants
#!/bin/sh

i=0
grep -E -o -h "[a-zA-Z0123456789=_-]+@([a-zA-Z0123456789=_-]+\.)+[a-zA-Z0123456789=_-]{2,3}" test | uniq | while read addr; do
	i=$(( $i + 1 ))
	printf "%s\t%s\n" "${i}" "${addr}"
	yourSendMailCommand "${addr}"
done

???
Deleted
()
Ответ на: комментарий от Deleted
Спасибо всем, считаю нужным поделиться с вами результатом:
#!/bin/bash
#выдёргиваем адреса из адресной книги
grep -E -o -h "[a-zA-Z0-9=_\.-]+@([a-zA-Z0-9=_\.-]+\.)+[a-zA-Z0-9=_-]{2,3}" ~/.kde4/share/apps/kabc/std.vcf | uniq | cat -n | expand > ~/abc
#цикл поочереди дожен выдёргивать строки из сделанного файла
i=1 #первая строка имеет номер 1
until [ "$i" -eq 5 ] #всего у нас 4 адреса
do
#выдёргиваем первую строку
show=$( grep -E -o -h $i+' '+'[a-zA-Z0-9=_\.-]+@([a-zA-Z0-9=_\.-]+\.)+[a-zA-Z0-9=_-]{2,3}' ~/abc | grep -E -o -h '[a-zA-Z0-9=_\.-]+@([a-zA-Z0-9=_\.-]+\.)+[a-zA-Z0-9=_-]{2,3}' )
#отображаем выдернутую строку
echo $show
#скрипт отправки сообщения на выдернутый адрес из первой строки
#yoursendmailcommand
#переходим на вторую строку
i=$(( $i + 1 ))
done
#удаляем результат жизнедеятельности
rm -f abc
exit
ants
() автор топика
Ответ на: комментарий от ants
предыдущий пример более в стиле шелла. Кодируя на шелле нужно сломать привычный многим стиль циклов, выдергивания i-й строки, и перейти на пайпы.
dilmah ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.