Intereting Posts
./configure: Нет такого файла или каталога в GCC Пошаговое руководство по установке двух разных ОС Linux и ОС Windows – на одном компьютере Как очистить последнюю информацию -10? Бит Setuid, похоже, не влияет на bash Как свернуть 'grep -c <токен> * .h * .cpp' в один счет? Перенаправить вывод команды в `time command` Как переместить кнопки окна на панель 3.16 gnome shell Синтаксис регулярного выражения Awk с числом повторений – различная обработка между gawk 3 и gawk 4 Файл конфигурации для виртуальной консоли Создать точки монтирования автоматически в / mnt, даже если / доступен только для чтения Поведение Alt + Tab в Gnome как сделать меньше -S не занимать весь экран sudo: не спрашивайте пароль при входе в систему с помощью ssh key Замените что-либо между круглыми скобками, даже если они охватывают несколько строк Добавьте пробел или вкладку перед последним символом в каждой строке

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

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

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

Я хочу только время.

Как я могу отделить их?

Анализ структуры ввода:

 key1=value1;key2=value2 

Это поля, разделенные ; , который вы можете проанализировать, сделав ; разделитель полей. Затем, чтобы извлечь значение поля, используйте sub функцию для удаления key= part (или split on /=/ и возьмите вторую часть, или возьмите подстроку после 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, вот один из способов сделать это с помощью 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 
 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 

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

 awk -F 'T' {'print $3'} input_file 

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

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

sed разрушает все до строки «Timing =» и включает в себя:

 2013-04-12T01:07:46.099 

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

 01:07:46.099 

Решение grep:

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

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

-P для использования регулярного выражения Perl, поэтому мы можем использовать …

(?<=lookahead_expr) вернет совпадение для следующего регулярного выражения: «positive lookbehind» – в нашем случае возвращает строку времени, следующую за строкой «EsbTiming =