LINUX.ORG.RU

Сократить bash код

 


0

2

Здравствуйте уважаемые! Навоял код для выборки определенных таблиц из базы, но складывается такое мнение что сделал немного не правильно, помогите оптимизировать этот код ведь я только учусь.

#!/bin/bash

mysql_result=`mysql_result 2>/dev/null` || mysql_result=/tmp/mysql_result$$

mysql -u root -pPASS  vmail --execute="SELECT username FROM mailbox \G" > $mysql_result

mysql_f1=$(cat $mysql_result)
mysql_f2=$(echo "${mysql_f1}" | rev | cut -d: -f1 | rev )
mysql_f3=$(echo "${mysql_f2}" | sed '/*/d')
mysql_f4=$(echo "${mysql_f3}" | sed 's/ *//')
echo "$mysql_f4"


Покажи что конкретно выводит mysql -u root -pPASS vmail --execute="SELECT username FROM mailbox \G" (данные можно ненастоящие, главное формат) и что из этого нужно получить.

mix_mix ★★★★★ ()

как минимум sed'ы можно написать в одну строку.

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

Просто в одну строку ящики выводит разделенные пробелом? А что получить-то из этого нужно? Что нужно в результате работы скрипта?

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

Извиняюсь не отформатировал сообщение...выводит списком... скрипт будет редактировать почтовые акаунты...(пишу для себя большой скрипт для управления сервером, так как не воспринимаю postfixadmin и прочий ненужный хлам)

ceroz ()

не оч понятно, зачем тебе временный файл

(upd: увидел объяснение того, что тебе надо)

я бы написал так

#! /bin/sh
mysql -u root -pPASS  vmail --execute="SELECT username FROM mailbox \G" \
    | awk -F': ' 'NR % 2 == 0 {print $2}'

f1u77y ★★★ ()
Последнее исправление: f1u77y (всего исправлений: 1)
Ответ на: комментарий от ceroz

Вот прям без рамок, без всего прочего списком выводит? Ты можешь залить сюда в [code]...[/code] или на pastebin.com вывод команды? Адреса только поменяй и огранить двумя-тремя. Получить, как я понимаю, нужно как раз сами адреса?

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

Запускаю

mysql -u root -pPASS  vmail --execute="SELECT username FROM mailbox \G"
получаю вот такой выхлоп...
*************************** 1. row ***************************
username: mail1@example.com
*************************** 2. row ***************************
username: mail2@example.com
*************************** 3. row ***************************
username: mail3@example.com

этот выхлоп нужно порезать следущим образом чтобы получить вот такой вот список.

mail1@example.com
mail2@example.com
mail3@example.com

Этим я режу «username:»

mysql_f2=$(echo "${mysql_f1}" | rev | cut -d: -f1 | rev )
Этим режу «*************************** 3. row ***************************»
mysql_f3=$(echo "${mysql_f2}" | sed '/*/d')
Этим режу пробел перед ящиком
mysql_f4=$(echo "${mysql_f3}" | sed 's/ *//')

В итоге получается тот список что мне нужен. но складывается впечатление что я делаю что то неправильно...и это можно сделать проще...

ceroz ()
Ответ на: комментарий от mix_mix

Во!!! Благодарю вас... у вас все рашилось одной строкой а у меня это растянулось аж на 5.

ceroz ()
Ответ на: комментарий от f1u77y

Спасибо уважаемый(ая) ваше решение тоже работает.

ceroz ()
Ответ на: комментарий от f1u77y

не оч понятно, зачем тебе временный файл

dialog читает у меня из временного файла

ceroz ()

я не очень знаю mysql. но форматирование вывода это подсилу mysql языку и клиенту.
документация говорит что mysql -N - убирает печать заголовка поля.
а чтобы вырезать «username: » из значений поля - в mysql есть строковые функции типа replace, locate.

bl ★★★ ()

Сократить bash код

Ну например последние 5 строк можно записать в одну:

cat $mysql_result | rev | cut -d: -f1 | rev | sed '/*/d' | sed 's/ *//'
Psych218 ★★★★★ ()

А зачем вообще \G в запросе? И зачем вообще скрипт?

mysql vmail -B -N -u root -pPASS -e "SELECT username FROM mailbox;"

И всего делов.

Stanson ★★★★★ ()

Не совсем понимаю, что должна делать первая строка. Но по идее, там можно совсем без временного файла, а сразу в пайп. То есть, целиком всё:

mysql -u root -pPASS  vmail --execute="SELECT username FROM mailbox \G" | rev | cut -d: -f1 | rev | sed '/*/d' | sed 's/ *//'

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