Как разделить эти два вывода с помощью команды awk?

Как разделить эти два вывода с помощью команды awk?

Вот мой вывод:

MessageID=3990592283244651750-30192b51.13df831d93a.7eb4;EsbTiming=2013-04-12T01:07:46.099

Мне нужно только время.

Как их разделить?

решение1

Проанализируйте структуру входных данных:

key1=value1;key2=value2

Это поля, разделенные ;, которые вы можете проанализировать, создав ;разделитель полей. Затем, чтобы извлечь значение поля, используйте subфункцию для удаления key=части (или spliton /=/и возьмите вторую часть, или возьмите подстроку после indexof =). Если время всегда находится во втором поле, это простой подход:

awk -F ';' '{sub(/^[^=]*=/, $2); print $2}'

Если вы хотите получить доступ к полю по имени (что, вероятно, более надежно), вы можете выполнить цикл по полям:

awk -F ';' '{i=1; while (i <= NF) {if ($i ~ /^EsbTiming=/) {sub(/^[^=]*=/, $i); print $i}}}'

Если вам нужно проанализировать только одну строку, проще создать ;разделитель записей и =разделитель полей.

awk -F '=' -v RS=';' '$1 == "EsbTiming" {print $2}'

Обратите внимание, что это печатает дополнительную новую строку. Это не проблема, если вы используете эту команду в подстановке команд в скрипте оболочки (… | awk …). Если вам не нужна эта дополнительная новая строка, установите ORS(разделитель выходных записей) на пустую строку:

awk -F '=' -v RS=';' -v ORS= '$1 == "EsbTiming" {print $2}'

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

awk 'match($0, /(^|;)EsbTiming=/) {s = substr($0, RSTART+RLENGTH); sub(/;.*/, "", s); print s}'

решение2

У вас есть несколько ответов awk, вот один из способов сделать это с помощью bash. Сначала оцените настройку переменной:

source <(echo "MessageID=3990592283244651750-30192b51.13df831d93a.7eb4;EsbTiming=2013-04-12T01:07:46.099")

Теперь вы можете получить EsbTimingпрямой доступ, например:

printf "Date: %s\nTime: %s\n" ${EsbTiming%T*} ${EsbTiming#*T}

Выход:

Date: 2013-04-12
Time: 01:07:46.099

решение3

awk 'BEGIN{ FS=":" } /Timing/ {print $2":"$3 }' Input_file

ИЛИ

awk  '/Timing/{split($0,arr,":") } {print arr[2]":"arr[3]}'  input_file

ИЛИ

awk -F: '/Timing/{$1=""; print}'  input_file

Решение Grep

grep -oP '(?<=EsbTiming=.{14}).*' Input_file

решение4

Если вы не против awk, sedвот довольно простой способ сделать это:

sed 's/.*Timing=//' file.txt |awk -FT '{print $2}'

sedчасть сворачивает все до строки «Timing=» включительно, оставляя вам:

2013-04-12T01:07:46.099

awkразделяется на символе «Т» и мы печатаем второе поле, которое является вашим временем.

01:07:46.099

Связанный контент