Возможно, это немного больше, чем нужно для этого конкретного случая, но кое-что, что может пригодиться в будущем, если вы планируете помещать результаты запроса SQL в свой сценарий оболочки ...
Рассмотрим упаковка значения поля (базы данных) в пару разделителей, которые не отображаются в поле; примеры могут включать в себя канал (|
), точку (.
) или даже многосимвольный разделитель, который увеличивает вероятность не найти совпадения в поле (базы данных) (например, .|.
).
Затем вы можете awk
использовать тот же разделитель для разделения полей.
Вы можете go чуть дальше и пометить только строку данных для выбора, предоставив поле для grep / pattern- соответствует (например, строка 'GREPME'). Это избавляет от необходимости заранее знать номера строк, в которых содержатся ваши данные.
Давайте начнем с запроса SQL, и в качестве разделителя мы будем использовать канал (|
):
$CMD_CONNX "select 'GREP'||'ME','|'||side_nbr||'|' from setup"
ПРИМЕЧАНИЕ : Чтобы не сопоставлять заголовок столбца 'GREPME', нам нужно разбить строку на 2 части, таким образом, чтобы только строка данных содержала строку 'GREPME'.
ПРИМЕЧАНИЕ : В зависимости от РСУБД и типа данных столбца может потребоваться преобразовать столбец в символ (var) перед добавлением разделителя в передней / задней части столбца.
Предположим, что ваш полный вывод выглядит примерно так:
Connecting to database xyz ...
Connect as myuser/***** ...
GREP||ME |||side_nbr|||
=========== ==================
GREPME | 4|
(1 row affected)
Одно awk
решение для анализа нужных данных:
awk -F"|" '/GREPME/ {print $2}'
Объединение всех вместе:
SIDE_NBR=$($CMD_CONNX "select 'GREP'||'ME','|'||side_nbr||'|' from setup" | awk -F"|" '/GREPME/ {print $2}')
Будет немного интереснее, если ваш инструмент запросов SQL предоставляет разделитель столбцов без пробелов для набора результатов (например, канал (|
)):
|Column1|Column2 |
|=======|=============|
|ABC |some data |
|DEF |and more data|
При анализе этого вывода возникают проблемы из-за «лишних» пробелов для первого столбца из-за того, что заголовок столбца шире, чем данные, и для первого столбца / второго столбца из-за того, что значение второго столбца / второго столбца шире.
Существует несколько способов обойти это. .. один пример использования амперсанда (&
) в качестве разделителя:
select 'GREP'||'ME&'||Column1||'&'||Column2||'&' from mytable
|GREP||ME&||Column1||&||Column2||&|
|=================================|
|GREPME&ABC&some data& |
|GREPME&DEF&and more data& |
, который можно проанализировать с помощью awk
, например:
<select_query> ... | awk -F"&" '/GREPME/ {print $2,$3)' | while read -r col1 col2; do ...
Anyhoo, множество способов нарезать это на кусочки, чтобы упростить анализ результирующего набора SQL во что-то, что можно использовать в сценарии оболочки.
(очевидная) общая идея состоит в том, чтобы иметь select
запросите форматирование ваших данных таким образом, чтобы обеспечить (более простой) анализ сценарием оболочки.