Я хочу использовать grep / awk / sed для извлечения совпавших строк для каждой строки файла журнала. Затем поместите его в CSV-файл.
Выделенные строки (1432,53 http://www.espn.com/)
Если ввод:
2018-10-31
18: 48: 01,717, INFO, 15592,15627, PfbProxy :: handlePfbFetchDone (0x1d69850,
pfbId = 561, pid = 15912, состояние = 4, fd = 78, таймер = 61), FETCH DONE: len = 45,
PFBId = 561, pid = 0, loadTime = 1434 мс, объекты = 53 , fetchReqEpoch = 0,0,
fetchDoneEpoch: 0.0, fetchId = 26, URL = http://www.espn.com/
2018-10-31
18: 48: 01.806, DEBUG, 15592.15621, FETCH DONE: len = 45, PFBId = 82, pid = 0,
loadTime = 1301 мс, объекты = 54 , fetchReqEpoch = 0.0, fetchDoneEpoch: 0.0,
fetchId = 28, URL = http://www.diply.com/
Ожидаемый вывод для указанных строк журнала:
URL,LoadTime,Objects
http://www.espn.com/,1434,53
http://www.diply.com/,1301,54
Это пример, и в самом файле журнала будет гораздо больше данных.
- My-Solution-So-* 1030 далеко *
Пока я использовал grep, чтобы получить все строки, содержащие ключевое слово «FETCH DONE» (эти строки содержат строки, которые я ищу).
Я придумал регулярное выражение, которое соответствует нужным мне данным, но когда я вставляю grep и помещаю его в файл, он печатает каждую строку в новой строке, что не совсем то, что я ищу.
Grep и регулярное выражение, которое я использую (онлайн-регулярное выражение: https://regexr.com/42cah):
echo -en 'url,loadtime,object\n'>test1.csv #add header
grep -Po '(?<=loadTime=).{1,5}(?= )|((?<=URL=).*|\/(?=.))|((?<=objects=).{1,5}(?=\,))'>>test1.csv #get matching strings
Фактическая выработка:
URL,LoadTime,Objects
http://www.espn.com
1434
53
http://www.diply.com
1301
54
Ожидаемый результат:
URL,LoadTime,Objects
http://www.espn.com/,1434,53
http://www.diply.com/,1301,54
Я пытался использовать awk для сопоставления нескольких регулярных выражений и печати запятой между ними. Я не мог заставить его работать по какой-то причине, хотя мое регулярное выражение совпадает с правильными строками.
Еще одна идея, которую я имею, это использовать sed для замены некоторого '\ n' на ',':
for(i=1;i<=n;i++)
if(i % 3 != 0){
sed REPLACE "\n" with "," on i-th line
}
Я уверен, что есть более эффективный способ сделать это