Как извлечь текст после ключевого слова в UNIX - PullRequest
1 голос
/ 29 мая 2019

У меня есть текстовый файл (file.txt), который содержит стену результатов (без новых строк, пробелов и т. Д.), Которые я получил из внешнего источника.Из этого файла мне нужно найти все упоминания слова serId, а затем распечатать буквенно-цифровую последовательность, следующую за ним.Буквенно-цифровая последовательность имеет любую длину, но заканчивается символом ,.Как извлечь эти буквенно-цифровые последовательности?

Я пытался найти сценарии / код с помощью sed / awk, но результаты, похоже, вращаются вокруг известной последовательности, а не неизвестной последовательности.

Например, я хотел бы извлечь 28655784-EE из следующего образца текста:

{"preRollbackCheckResults":[],"patchingHistory":[{"backupStatus":"Available","rollbackStatus":"Available","additionalNote":"Patching CDS as planned","appliedBy":"xxrbsgCDS02services","appliedDate":"2019-01-18T12:45:33.926+0000","totalTime":"29 min, 47 sec","serId":"28655784-EE","patchDescription":"DB 18.4.0.0.0 Oct 2018 PSU

Ответы [ 4 ]

2 голосов
/ 29 мая 2019

Попробуйте этот сценарий awk (только gawk):

awk  -F '","' 'match($0,/serId\":\"[^,]*/,m){print m[1]}' input.txt

Если вам нужен терминатор ,

awk  -F '","' 'match($0,/serId\":\"[^,]*/,m){print m[1]","}' input.txt

Объяснение:

-F "," разобрать файл с записями, разделенными ,

match($0,"serId[^,]*",m) фильтр в текущей записи, соответствующий строке, начинающейся с serId и заканчивающейся ,. Поместите результат в массив m

print substr(m[0],8) вывести соответствующую строку из 8-й позиции

1 голос
/ 29 мая 2019

grep -o является действительно простым решением для этого:

Я создал файл, содержащий следующие строки:

serId12345
serIdABCde123;
Ser_idblabla;

Первая строка не заканчивается полудвоеточие, третья строка начинается с неправильного слова, поэтому только вторая строка является правильной.

Я запустил следующую команду: grep -o "serId[0-9a-zA-Z]*;" testtttt.txt, со следующим результатом:

serIdABCde123;
0 голосов
/ 30 мая 2019

С любым седом:

$ sed 's/.*"serId":"\([^"]*\).*/\1/' file
28655784-EE
0 голосов
/ 29 мая 2019

Основываясь на коротком образце, который вы разместили в комментарии, у меня есть два предложения:

  • Если файл корректно сформирован json, попробуйтечтобы понять его структуру и использовать jq.

  • Если он искажен и может быть интерпретирован только как набор текста, используйте следующий Perl:

    perl -lne '@m=/"serId":"([^"]+)"/g; print "@m"' file.txt
    

    Тестовый прогон:

    $ cat file.txt
    {"preRollbackCheckResults":[],"patchingHistory":[{"backupStatus":"Available","rollbackStatus":"Available","additionalNote":"Patching CDS as planned","appliedBy":"xxrbsgCDS02services","appliedDate":"2019-01-18T12:45:33.926+0000","totalTime":"29 min, 47 sec","serId":"28655784-EE","patchDescription":"DB 18.4.0.0.0 Oct 2018 PSU{"preRollbackCheckResults":[],"patchingHistory":[{"backupStatus":"Available","rollbackStatus":"Available","additionalNote":"Patching CDS as planned","appliedBy":"xxrbsgCDS02services","appliedDate":"2019-01-18T12:45:33.926+0000","totalTime":"29 min, 47 sec","serId":"28655784-EE","patchDescription":"DB 18.4.0.0.0 Oct 2018 PSU
    
    $ perl -lne '@m=/"serId":"([^"]+)"/g; print "@m"' file.txt
    28655784-EE 28655784-EE
    

...