Кажется, вы думаете, что awk
обрабатывает свой ввод как многострочную строку. Это не так. Когда вы запускаете сценарий awk для файла, сценарий применяется к каждой строке файла отдельно. Итак, ваш gensub
запускался один раз на каждой строке. Вы действительно можете делать что хотите с awk
, но на самом деле это не лучший инструмент для работы.
Насколько я могу судить, у вас большой файл, и вы хотите напечатать только число, которое следует после знака :
и пробела. Если так, то все эти подходы проще, чем дурачиться с gensub
:
Используйте grep
с Perl-совместимыми регулярными выражениями ( -P
)
$ grep -oP 'mark: \ s * \ K \ d +' file
98
-o
заставляет grep
печатать только совпадающая часть строки. \ K
- это конструкция PCRE, которая означает «игнорировать все, что было найдено до этой точки».
sed
$ sed -n 's /.* mark: \ s * \ ([0-9] \ + \). * / \ 1 / p' file
98 {{1 }}
-n
подавляет нормальный вывод. p
в конце заставляет sed
печатать только в том случае, если подстановка прошла успешно. Само регулярное выражение захватывает строку чисел, следующую за меткой :
и 0 или более символов пробела, и заменяет всю строку тем, что было захвачено.
Perl
$ perl -ne 'печатать, если s /.* mark: \ s * (\ d +). * / $ 1 /' file
98
-n
указывает perl построчно читать входной файл и применять сценарий, заданный как -e
.Скрипт напечатает любые строки, в которых подстановка прошла успешно.
Если вы действительно, действительно хотите использовать gensub
, вы можете сделать что-то вроде:
$ awk '/mark:/{print gensub(/.*mark:\s*([0-9]+).*/,"\\1","g")}' file
98
Лично я бы сделал это в awk следующим образом:
$ awk '/mark:/{gsub(/[^0-9]/,"");print}' file
98
Поскольку вы, похоже, пытались получить awk для получения многострочного ввода, вот как вы можете это сделать (при условии, что в вашем файле нет NULL-символов):
$ awk '{print(gensub(/^.*mark: ([0-9]+).*$/,"\\1","g"))}' RS='\0' file
98
RS = '\ 0'
устанавливает разделитель входных записей (это то, что определяет «строка» для awk
) до \ 0
. Поскольку в вашем файле таких символов нет, это приводит к тому, что awk
читает все сразу.