На моем 64-разрядном поле я обычно устанавливаю любые соответствующие 32-разрядные библиотеки на своих 64-разрядных библиотеках, таким образом, я не сталкиваюсь с этой проблемой. Несомненно, это - дополнительные библиотеки, в которых я, возможно, не нуждался бы или когда-либо использовал бы, но с другой стороны, я обычно не получаю эти ошибки также.
Проанализируйте структуру входа:
key1=value1;key2=value2
Это поля, разделенные ;
, который можно проанализировать путем создания ;
разделитель полей. Затем для извлечения значения поля используйте sub
функция для удаления key=
часть (или split
на /=/
и примите второе участие или возьмите подстроку после index
из =
). Если время всегда находится во втором поле, это - простой подход:
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}'
У Вас есть несколько ответов awk, вот один способ, которым Вы могли сделать это с ударом. Сначала оцените переменную установку:
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
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
Если Вы не возражаете использовать awk
и sed
вот довольно простой способ сделать это:
sed 's/.*Timing=//' file.txt |awk -FT '{print $2}'
sed
часть сворачивает все до и включая строку, "Синхронизирующую =" отъезд Вас с:
2013-04-12T01:07:46.099
awk
разделения на символе "T" и мы распечатываем 2-е поле, которое является Вашим временем.
01:07:46.099
grep решение:
grep -oP "(?<=EsbTiming=).*" input
-o
распечатать только соответствие, не целую строку
-P
использовать Perl regex, таким образом, мы можем использовать...
(?<=lookahead_expr)
возвратится достойный следующего regex, "положительный lookbehind" - в нашем случае, возвращая строку времени, которая следует за строкой 'EsbTiming ='