Удалить строку после совпадения вместе со словом / строкой после этого - PullRequest
0 голосов
/ 30 марта 2020

У меня есть файл, содержащий строки следующего шаблона.

date=2020-02-22 time=13:32:41 type=text subtype=text ip=1.2.3.4 country="China" service="foo"  id=47291 msg="foo: bar.baz," value=50
date=2020-03-17 time=11:49:54 type=text subtype=anothertext ip=1.2.3.5 country="Russian Federation" service="bar"  id=47324 msg="foo: bar.baz," value=30
date=2020-03-30 time=16:29:24 type=text subtype=someothertext ip=1.2.3.6 country="Korea, Republic of" service="grault, garply"  id=47448 msg="foo: bar.baz," value=60

Я хотел бы удалить тип, подтип и службу вместе со значением этих полей (значение после =).

Желаемый результат:

date=2020-02-22 time=13:32:41 ip=1.2.3.4 country="China" id=47291 msg="foo: bar.baz," value=50
date=2020-03-17 time=11:49:54 ip=1.2.3.5 country="Russian Federation" id=47324 msg="foo: bar.baz," value=30
date=2020-03-30 time=16:29:24 ip=1.2.3.6 country="Korea, Republic of" id=47448 msg="foo: bar.baz," value=60

Я пытался, с небольшим знанием, использовать cut, awk, sed, но все еще не близко к решению. Я искал в Интернете часами, но это тоже тщетно. Может ли кто-нибудь помочь, пожалуйста?

Ответы [ 3 ]

1 голос
/ 30 марта 2020

Вы можете использовать это sed:

sed -E 's/(^|[[:blank:]]+)(subtype|type|service)=[^[:blank:]]+//g' file

date=2020-02-22 time=13:32:41 ip=1.2.3.4 country="China"  id=47291 msg="foo: bar.baz," value=50
date=2020-03-17 time=11:49:54 ip=1.2.3.5 country="Russian Federation"  id=47324 msg="foo: bar.baz," value=30
date=2020-03-30 time=16:29:24 ip=1.2.3.6 country="Korea, Republic of" garply"  id=47448 msg="foo: bar.baz," value=60
1 голос
/ 30 марта 2020

Что-то, что вы, возможно, захотите использовать или построить позже:

$ cat tst.awk
BEGIN {
    split(s,tmp)
    for (i in tmp) {
        skip[tmp[i]]
    }
    FPAT = "[^ ]+(=\"[^\"]+\")?"
}
{
    c=0
    for (i=1; i<=NF; i++) {
        tag = gensub(/=.*/,"",1,$i)
        if ( !(tag in skip) ) {
            printf "%s%s", (c++ ? OFS : ""), $i
        }
    }
    print ""
}

$ awk -v s='type subtype service' -f tst.awk file
date=2020-02-22 time=13:32:41 ip=1.2.3.4 country="China" id=47291 msg="foo: bar.baz," value=50
date=2020-03-17 time=11:49:54 ip=1.2.3.5 country="Russian Federation" id=47324 msg="foo: bar.baz," value=30
date=2020-03-30 time=16:29:24 ip=1.2.3.6 country="Korea, Republic of" id=47448 msg="foo: bar.baz," value=60

Вышеприведенное использует GNU awk для FPAT и gensub ().

0 голосов
/ 30 марта 2020

вы можете попробовать что-то вроде этого:

awk -F " " '{ $3=""; $4=""; $5="";  print}' file

вы в основном настраиваете столбцы на пустую строку.

...