![Как разделить эти два вывода с помощью команды awk?](https://rvso.com/image/31645/%D0%9A%D0%B0%D0%BA%20%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D1%8C%20%D1%8D%D1%82%D0%B8%20%D0%B4%D0%B2%D0%B0%20%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B0%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B%20awk%3F.png)
Вот мой вывод:
MessageID=3990592283244651750-30192b51.13df831d93a.7eb4;EsbTiming=2013-04-12T01:07:46.099
Мне нужно только время.
Как их разделить?
решение1
Проанализируйте структуру входных данных:
key1=value1;key2=value2
Это поля, разделенные ;
, которые вы можете проанализировать, создав ;
разделитель полей. Затем, чтобы извлечь значение поля, используйте sub
функцию для удаления key=
части (или split
on /=/
и возьмите вторую часть, или возьмите подстроку после index
of =
). Если время всегда находится во втором поле, это простой подход:
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