У меня есть файл журнала с текстом:
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
Можно ли помочь мне с этой задачей?
Если Ваше поле даты сопровождается приблизительно пробелы, в то время как другие поля разделяются единственный пробелы как показано в Вашем примере, то Вы могли сделать
$ 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"
Маленький сценарий 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 слова и присоединяемся к ним вместе в строку, которой присоединили новую строку перед ним после этого, мы просто заменяем #
той новой строкой - и альт!