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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.