Я пытаюсь найти способ использовать awk, чтобы начать печать только после того, как он найдет параметр поиска и напечатает только пару столбцов, следующих за ним.
Чтобы попытаться объяснить немного лучше, я просматриваю файл журнала, который выводит много информации в виде одной строки. Я хочу взять и экстраполировать только некоторые аспекты этой линии. Т.е. где-то в нем есть большой файл с такой строчкой:
бла-бла-бла, здесь много информации для имени: Джон Доу, и это просто продолжается и не прекращается.
Я хочу, чтобы он выполнял поиск по имени и только распечатывал:
имя: John Doe
Я знаю, что могу использовать сегмент столбца, но на самом деле я не знаю, где в этой строке имя будет в другом файлы.
Это также можно сделать с помощью awk
:
$ awk 'match( $0, /name [A-Z][a-z]* [A-Z][a-z]*/ ) { print substr( $0, RSTART, RLENGTH ) }' /path/to/inputfile
Самый простой ответ НЕ включает awk
. Он будет использовать grep
для вывода любых совпадений слова «имя» и до двух слов, следующих за :
grep -o 'name [A-Za-z]* [A-Za-z]*' filename
Переключатель -o
включает только совпадающие части, а не всю строку; и [A-Za-z]*
говорит, что вы просите одно слово.
Дайте мне знать, если вы предпочитаете делать это в awk
--, но это будет намного сложнее.
Perl раствор:
perl -lne '/(name:\s+\w+\s+\w+)/ and print $1'
\s
соответствует пробельным символам (пробелам для просмотра, табуляции и т. д.)\w
соответствует буквам и цифрам -lne
означает ничего не печатать (n ), за исключением случаев, когда используется печать, вывести новую строку в конце (l )и выполнить (e )следующее Таким образом, вся строка будет соответствовать имени :, за которым следуют один или несколько пробельных символов и одна или несколько букв, снова один или несколько пробельных символов и одна или несколько букв, и затем это будет напечатано.