Как вывести несколько совпадений регулярных выражений через запятую в одной строке - PullRequest
0 голосов
/ 02 ноября 2018

Я хочу использовать 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 
    }

Я уверен, что есть более эффективный способ сделать это

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Использование sed:

sed -n 's/.*loadTime=\([0-9]*\)[^,]*, objects=\([0-9]*\).* URL=\(.*\)/\3,\1,\2/p' input | \
  sed 1i'URL,LoadTime,Objects'
0 голосов
/ 02 ноября 2018

Не могли бы вы попробовать следующее.

awk '
BEGIN{
  print "URL,LoadTime,Objects"
}
NF{
   match($0,/URL=.*\//)
   url=substr($0,RSTART,RLENGTH)
   match($0,/loadTime=[^ ]*/)
   loadtime=substr($0,RSTART+9,RLENGTH-9)
   match($0,/objects=[^ ]*/)
   object=substr($0,RSTART+8,RLENGTH-9)
   print url,loadtime,object
   url=object=loadtime=""
}
' OFS=","  Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...