BASH - извлечение данных из строки - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть журнал, который возвращает тысячи строк данных, я хочу извлечь из него несколько значений.

В журнале есть только одна строка, содержащая ссылку unquie unit, поэтому я могу выполнить grepдля этого, используя:

grep "unit=Central-C152" logfile.txt

, который производит строку вывода, подобную следующей:

a3cd23e,85d58f5,53f534abef7e7,unit=Central-C152,locale=32325687-8595-9856-1236-12546975,11="School",1="Mr Green",2="Qual",3="SWE",8="report",5="channel",7="reset",6="velum"

Формат строки может измениться в этом порядкеиз значений не всегда будет в том же положении.

Я пытаюсь понять, как получить значения 2 и 7 для разделения переменных.Я думал о cut или =, но так как значения не в установленном порядке, я не смог найти лучший способ сделать это.

Я пытаюсь получить:

var state=value of 2 without quotes var mode=value of 7 without quotes

Кто-нибудь может посоветовать лучший способ сделать это?

Спасибо

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Вам, вероятно, лучше делать всю обработку в Awk.

awk -F, '/unit=Central-C152/ {
    for(i=1;i<=NF;++i)
        if($i ~ /^[27]="/) {
            b[++k] = $i
            sub(/^[27]="/, "", b[k])
            sub(/"$/, "", b[k])
            gsub(/\\/, "", b[k])
        }
    print "state " b[1] ", mode " b[2]
    }' logfile.txt

Это предполагает, что поля всегда располагаются в одном и том же порядке (от 2 до 7). Возможно, вам нужно изменить или отключить gsub, чтобы удалить обратную косую черту в значениях.

Если вы хотите сделать больше, чем просто печатать значения, рефакторинг любого кода Bash, который у вас есть, в Awk, часто является лучшим подходом, чем выполнение этой обработки в Bash.

0 голосов
/ 17 сентября 2018

Предполагая, что у вас уже есть строка в переменной, например:

line="$(grep 'unit=Central-C152' logfile.txt | head -1)"

Вы можете просто использовать встроенные функции замены параметров bash:

f2=${line#*2=\"} ; f2=${f2%%\"*} ; echo ${f2}
f7=${line#*7=\"} ; f7=${f7%%\"*} ; echo ${f7}

Первая команда в каждой строке удаляет первую часть строки вплоть до <field-number>=".Затем вторая команда удаляет все, что находится за (и в том числе) первой кавычкой.Третий, конечно, просто повторяет значение.

Когда я запускаю эти команды для вашей строки ввода, я вижу:

Qual
reset

, что, насколько я вижу, то, что выбыли после.

0 голосов
/ 17 сентября 2018

Не могли бы вы попробовать создать значения переменной.

state=$(awk '/unit=Central-C152/ && match($0,/2=\"[^"]*/){print substr($0,RSTART+3,RLENGTH-3)}' Input_file)
mode=$(awk '/unit=Central-C152/ && match($0,/7=\"[^"]*/){print substr($0,RSTART+3,RLENGTH-3)}'  Input_file)

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

echo "$state"
echo "$mode"

Объяснение: Добавление объяснения команды тоже сейчас.

awk '                                           ##Starting awk program here.
/unit=Central-C152/ && match($0,/2=\"[^"]*/){   ##Checking condition if a line has string (unit=Central-C152) and using match using REGEX to check from 2 to till "
  print substr($0,RSTART+3,RLENGTH-3)           ##Printing substring starting from RSTART+3 till RLENGTH-3 characters.
}
' Input_file                                    ##Mentioning Input_file name here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...