2015-10-07 3 views
0

Я не понимаю, как заменить пробелы только в 'sproc =' путь к файлу этого журнала для разбора. Я пытаюсь использовать awk (используя awk -F" "), чтобы распечатать только поле sproc =, поле user = и несколько других, но мои результаты несовместимы, потому что некоторые из полей «sproc =» имеют пробелы в именах файлов. Может ли кто-нибудь дать некоторые рекомендации о том, как удалять пробелы из имени файла, но не другие пробелы в сообщении о событиях?sed заменяет пробелы в пути имени файла из события syslog

user=myuser sproc=C:\\Program Files\\Windows NT\\Accessories\\wordpad.exe act=read_file fileId=F:\\afolder\\hifile filePath=\\Test1 Data\\Read this too.rtf somevar=somedata anothervar=moredata 

пример вывода:

[email protected] ~ $ awk -F" " '{print "the user is: " $1 "the sproc is: " $2 "somevar is: " $6 }' < sedme 
the user is: user=myuserthe sproc is: sproc=C:\\Program somevar is: fileId=F:\\afolder\\hifile 

ожидается выход:

the user is: user=myuserthe sproc is: sproc=C:\\Program Files\\Windows NT\\Accessories\\wordpad.exe somevar is: somevar=somedata 
+1

пост несколько строк ввода образца и ожидаемого результата. –

ответ

1

Я думаю, что это лучше сделать в Perl, если у Вас есть это:

perl -ne 'while(/(^|\s+)(\w+)=(.*?)(?=($|\s+\w+=))/g){print "the $2 is: $3\n"}' 

Ключевой шаблон признание [пространства] [ключевое слово] = [значение], а не только пространство-разделение.

я получаю следующее на ваших данных:

the user is: myuser 
the sproc is: C:\\Program Files\\Windows NT\\Accessories\\wordpad.exe 
the act is: read_file 
the fileId is: F:\\afolder\\hifile 
the filePath is: \\Test1 Data\\Read this too.rtf 
the somevar is: somedata 
the anothervar is: moredata 
0

Использование grep -oP вы можете получить sproc=... значение:

grep -oP 'sproc=.+?(?= +\w+=)' file 
sproc=C:\\Program Files\\Windows NT\\Accessories\\wordpad.exe 

Или, если вы хотите получить избавиться от sproc=, а также:

grep -oP 'sproc=\K.+?(?= +\w+=)' file 
C:\\Program Files\\Windows NT\\Accessories\\wordpad.exe 
+0

Было бы неплохо иметь совместимую с POSIX строку grep для этого, но -o действительно полезно и, вероятно, следует добавить в спецификации. –

1

Однако вы хотите, чтобы делать все, что вы хотите сделать, это включено в этот сценарий:

$ cat tst.awk 
{ 
    while (match($0,/[^[:space:]=]+=[^=]+/)) { 
     fld = substr($0,RSTART,RLENGTH) 
     sub(/[[:space:]]+[^[:space:]]+$/,"",fld) 
     f[++nf] = fld 
     split(fld,a,/=/) 
     n2v[a[1]] = a[2] 
     $0 = substr($0,RSTART+length(fld)) 
    } 

    for (i=1; i<=nf; i++) { 
     print i, "<" f[i] ">" 
    } 

    print "" 

    for (name in n2v) { 
     value = n2v[name] 
     print name, "= [" value "]" 
    } 
} 

.

$ awk -f tst.awk file 
1 <user=myuser> 
2 <sproc=C:\\Program Files\\Windows NT\\Accessories\\wordpad.exe> 
3 <act=read_file> 
4 <fileId=F:\\afolder\\hifile> 
5 <filePath=\\Test1 Data\\Read this too.rtf> 
6 <somevar=somedata> 
7 <anothervar=moredata> 

sproc = [C:\\Program Files\\Windows NT\\Accessories\\wordpad.exe] 
user = [myuser] 
filePath = [\\Test1 Data\\Read this too.rtf] 
anothervar = [moredata] 
somevar = [somedata] 
fileId = [F:\\afolder\\hifile] 
act = [read_file] 

как раз вы выбираете как вы хотите сохранить и получить доступ к полям.

Смежные вопросы