конвертировать однострочный журнал в правильный формат, используя awk - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть значение в журнале программы в строке (весь журнал идет в одну строку), я хотел бы преобразовать в многострочное, awk сделал бы это однозначно, но как пройти через одну строку?

У меня есть код ниже в bash (где str содержит всю строку журнала, сгенерированную программой, всего в одной строке)

str="2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - Start of job execution 2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - exec(0, 0, START.0) 2019/04/24 23:26:42 - START - Starting job entry 2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - Starting entry [Call_Param_File] 2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - exec(1, 0, Call_Param_File.0) 2019/04/24 23:26:42 - Call_Param_File - Starting job entry 
 - blah blah blah..."
echo $str|awk 'BEGIN { ORS=" \n "}; { printf "%s %s %s", $1,$2,$3}'

Приведенная выше команда awk сделаетвыведите три начальных значения текста журнала, которые разделены "-".но это должно быть сделано в цикле, так как я ожидаю вывод, как показано ниже, который имеет дату или метку времени и короткое сообщение и сопровождается длинными строками сообщения.

2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - Start of job execution 
2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - exec(0, 0, START.0) 
2019/04/24 23:26:42 - START - Starting job entry 
2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - Starting entry [Call_Param_File] 
2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - exec(1, 0, Call_Param_File.0) 
2019/04/24 23:26:42 - Call_Param_File - Starting job entry - blah blah blah...

Как мы можем сделать это с помощью awk?

str="2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - Start of job execution 2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - exec(0, 0, START.0) 2019/04/24 23:26:42 - START - Starting job entry 2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - Starting entry [Call_Param_File] 2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - exec(1, 0, Call_Param_File.0) 2019/04/24 23:26:42 - Call_Param_File - Starting job entry 
 - blah blah blah..."
echo $str|awk 'BEGIN { ORS=" \n "}; { printf "%s %s %s", $1,$2,$3}'

Ожидаемый конечный результат: -

2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - Start of job execution 
2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - exec(0, 0, START.0) 
2019/04/24 23:26:42 - START - Starting job entry 
2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - Starting entry [Call_Param_File] 
2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - exec(1, 0, Call_Param_File.0) 
2019/04/24 23:26:42 - Call_Param_File - Starting job entry - blah blah blah...

Ответы [ 4 ]

0 голосов
/ 25 апреля 2019

Учитывая этот вход:

$ str='2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - Start of job execution 2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - exec(0, 0, START.0) 2019/04/24 23:26:42 - START - Starting job entry 2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - Starting entry [Call_Param_File] 2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - exec(1, 0, Call_Param_File.0) 2019/04/24 23:26:42 - Call_Param_File - Starting job entry - blah blah blah...'

С GNU awk для мульти-символьных RS и RT:

$ echo "$str" | awk -v RS='[0-9/]{10} [0-9:]{8} |\n' 'NR>1{print p $0} {p=RT}'
2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - Start of job execution
2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - exec(0, 0, START.0)
2019/04/24 23:26:42 - START - Starting job entry
2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - Starting entry [Call_Param_File]
2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - exec(1, 0, Call_Param_File.0)
2019/04/24 23:26:42 - Call_Param_File - Starting job entry - blah blah blah...
0 голосов
/ 25 апреля 2019

пробовал на GNU AWK

awk -vRS='([0-9]{2,4}/?){3}' '{printf $0"\n"RT}' <<<$str

пробовал на GNU SED

 sed -E 's/([0-9]{2,4}\/?){3}/\n&/g'<<<$str
0 голосов
/ 25 апреля 2019

Поскольку это апрель, а это строка bash, тогда может быть достаточен bash замещающий кладж:

echo "${str// 2019/$'\n'2019}"

Вывод:

2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - Start of job execution
2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - exec(0, 0, START.0)
2019/04/24 23:26:42 - START - Starting job entry
2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - Starting entry [Call_Param_File]
2019/04/24 23:26:42 - Main_Cons_Job_edw_cc_sf_accts_assets_feed - exec(1, 0, Call_Param_File.0)
2019/04/24 23:26:42 - Call_Param_File - Starting job entry

Примечание: Поскольку *Подстановка строк в 1009 * менее универсальна, чем в sed и awk, этот код не будет работать, если это будет канун Нового года, потому что подстановка будет пропускать строки, начинающиеся с 2020/01/01.При условии, что строки журнала не содержат строку "20" (обратите внимание на начальный пробел), это может быть полезно в течение следующих 80 лет:

echo "${str// 20/$'\n'20}"
0 голосов
/ 25 апреля 2019

Не могли бы вы попробовать следующее (протестировано только с предоставленными образцами).

echo "$str" | awk '{val=$1;$1="";gsub(/[0-9]+\/[0-9]+\/[0-9]+/,ORS "&");print val $0}'

РЕДАКТИРОВАТЬ: Добавление версии комментария @ Corentin тоже здесь:

echo $str | awk '{print gensub(/.([0-9\/]{10})/, "\n\\1", "g")}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...