НЕ удаляйте пробелы в переменной - PullRequest
0 голосов
/ 15 февраля 2020

Я создаю переменную в сценарии bash, чтобы извлечь поле из базы данных sql. Там могут быть пробелы, и я хочу это увидеть.

SIDE_NBR=$($CMD_CONNX "select side_nbr from setup" | awk 'NR==6{print$1}'|tr -d '\r'

Мне нужен tr -d '\ r', поскольку он входит с возвратом каретки. Тем не менее, это поле может быть

"    4"

или

"4"

Я хочу увидеть эти пробелы, поэтому при последующем вызове моей переменной я могу

log "Side_nbr=\"$SIDE_NBR\""

И в моем журнале будет отображаться "4" или "4"

Ответы [ 2 ]

0 голосов
/ 15 февраля 2020

Возможно, это немного больше, чем нужно для этого конкретного случая, но кое-что, что может пригодиться в будущем, если вы планируете помещать результаты запроса 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 запросите форматирование ваших данных таким образом, чтобы обеспечить (более простой) анализ сценарием оболочки.

0 голосов
/ 15 февраля 2020

Чтобы опубликовать официальный ответ.

{print $ 1} в awk удалит начальные пробелы.

Просто использование 'NR == 6' работает для того, что я делаю. Спасибо всем!

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