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

На моем 64-разрядном поле я обычно устанавливаю любые соответствующие 32-разрядные библиотеки на своих 64-разрядных библиотеках, таким образом, я не сталкиваюсь с этой проблемой. Несомненно, это - дополнительные библиотеки, в которых я, возможно, не нуждался бы или когда-либо использовал бы, но с другой стороны, я обычно не получаю эти ошибки также.

2
04.05.2013, 01:36
6 ответов

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

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}'
3
27.01.2020, 21:53

У Вас есть несколько ответов 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
2
27.01.2020, 21:53
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
1
27.01.2020, 21:53
  • 1
    Это добирается, избавил от двоеточий, ": ". Я получаю это" 07 46,099 дюймов. –  slm♦ 03.05.2013, 05:26
  • 2
    @slm я обновил еще один ответ –  Rahul Patil 03.05.2013, 05:46

Простой, разделенный "T"

awk -F 'T' {'print $3'} input_file
1
27.01.2020, 21:53

Если Вы не возражаете использовать 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
0
27.01.2020, 21:53

grep решение:

grep -oP "(?<=EsbTiming=).*" input

-o распечатать только соответствие, не целую строку

-P использовать Perl regex, таким образом, мы можем использовать...

(?<=lookahead_expr) возвратится достойный следующего regex, "положительный lookbehind" - в нашем случае, возвращая строку времени, которая следует за строкой 'EsbTiming ='

0
27.01.2020, 21:53
  • 1
    , который Он попросил awk основанное решение –  Eugene S 03.05.2013, 05:58
  • 2
    я знаю. Он должен использовать правильный инструмент для задания. Предоставленный я не знаю, что его определенные обстоятельства, но на основе вопроса, grep являются более простым выбором. –  Nathan Wallace 03.05.2013, 15:04
  • 3
    -P регулярные выражения Perl использования. –  Thor 04.05.2013, 14:54

Теги

Похожие вопросы