символы замены к разрыву строки (\n) и добавляют три первых столбца с начала строки

У меня есть файл журнала с текстом:

Jan 10 09:56:17  1484207777.225918 GET "8.8.8.8" "curl/7.27.0" #0121484207777.226639 GET "8.8.8.9" "curl/7.21.0" #0121484207777.226639 GET "8.8.5.9" "curl/7.22.0"
Jan 10 19:59:17  1484207777.225456 GET "8.8.6.8" "curl/7.24.0" #0121484207777.226639 GET "8.8.5.9" "curl/7.21.0" #0121484207777.226425 GET "8.8.5.9" "curl/7.22.0"

Я должен заменить символы "#" к разрыву строки (\n) и добавить дату/время от этой строки.

Я должен закончиться:

Jan 10 09:56:17  1484207777.225918 GET "8.8.8.8" "curl/7.27.0" 
Jan 10 09:56:17  0121484207777.226639 GET "8.8.8.9" "curl/7.21.0" 
Jan 10 09:56:17  0121484207777.226639 GET "8.8.5.9" "curl/7.22.0"
Jan 10 19:59:17  1484207777.225456 GET "8.8.6.8" "curl/7.24.0" 
Jan 10 19:59:17  0121484207777.226639 GET "8.8.5.9" "curl/7.21.0" 
Jan 10 19:59:17  0121484207777.226425 GET "8.8.5.9" "curl/7.22.0"

Я попробовал sed, но без результата.

for a in $(cat logs)

do

b=$(cat logs | awk '{print $1, $2, $3}')

echo "$a" | sed 's/#/\n"$b"/g'

done

Можно ли помочь мне с этой задачей?

2
задан 12 January 2017 в 18:00

2 ответа

Если Ваше поле даты сопровождается приблизительно пробелы, в то время как другие поля разделяются единственный пробелы как показано в Вашем примере, то Вы могли сделать

$ awk -F'  +' '{n = split($2,a,"#"); for (i=1;i<=n;i++) print $1,a[i]}' log
Jan 10 09:56:17 1484207777.225918 GET "8.8.8.8" "curl/7.27.0"
Jan 10 09:56:17 0121484207777.226639 GET "8.8.8.9" "curl/7.21.0"
Jan 10 09:56:17 0121484207777.226639 GET "8.8.5.9" "curl/7.22.0"
Jan 10 19:59:17 1484207777.225456 GET "8.8.6.8" "curl/7.24.0"
Jan 10 19:59:17 0121484207777.226639 GET "8.8.5.9" "curl/7.21.0"
Jan 10 19:59:17 0121484207777.226425 GET "8.8.5.9" "curl/7.22.0"

В более общем плане, Вы могли занять место # следующим образом

$ awk '{gsub(/#/, sprintf("\n%s %s %s ", $1, $2, $3))} 1' log
Jan 10 09:56:17  1484207777.225918 GET "8.8.8.8" "curl/7.27.0"
Jan 10 09:56:17 0121484207777.226639 GET "8.8.8.9" "curl/7.21.0"
Jan 10 09:56:17 0121484207777.226639 GET "8.8.5.9" "curl/7.22.0"
Jan 10 19:59:17  1484207777.225456 GET "8.8.6.8" "curl/7.24.0"
Jan 10 19:59:17 0121484207777.226639 GET "8.8.5.9" "curl/7.21.0"
Jan 10 19:59:17 0121484207777.226425 GET "8.8.5.9" "curl/7.22.0"
4
ответ дан 2 December 2019 в 02:16

Маленький сценарий Python может сделать задание:

#!/usr/bin/env python
from __future__ import print_function
import sys

for line in sys.stdin:
    timestamp = "\n" + " ".join(line.strip().split()[0:3])
    print(line.replace('#',timestamp),end="")

И демонстрация того, как это работает:

$ ./break_lines.py < input.txt                                                                                           
Jan 10 09:56:17  1484207777.225918 GET "8.8.8.8" "curl/7.27.0" 
Jan 10 09:56:170121484207777.226639 GET "8.8.8.9" "curl/7.21.0" 
Jan 10 09:56:170121484207777.226639 GET "8.8.5.9" "curl/7.22.0"
Jan 10 19:59:17  1484207777.225456 GET "8.8.6.8" "curl/7.24.0" 
Jan 10 19:59:170121484207777.226639 GET "8.8.5.9" "curl/7.21.0" 
Jan 10 19:59:170121484207777.226425 GET "8.8.5.9" "curl/7.22.0"

Объяснение того, как это работает, просто - мы повреждаем строку в слова, и берем сначала 3 слова и присоединяемся к ним вместе в строку, которой присоединили новую строку перед ним после этого, мы просто заменяем # той новой строкой - и альт!

0
ответ дан 2 December 2019 в 02:16

Другие вопросы по тегам:

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