dpkg не работает должным образом

Кажется, вы думаете, что awk обрабатывает свой ввод как многострочную строку. Это не так. Когда вы запускаете сценарий awk для файла, сценарий применяется к каждой строке файла отдельно. Итак, ваш gensub запускался один раз на каждой строке. Вы действительно можете делать что хотите с awk , но на самом деле это не лучший инструмент для работы.

Насколько я могу судить, у вас большой файл, и вы хотите напечатать только число, которое следует после знака : и пробела. Если так, то все эти подходы проще, чем дурачиться с gensub :

  1. Используйте grep с Perl-совместимыми регулярными выражениями ( -P )

     $ grep -oP 'mark: \ s * \ K \ d +' file 
    98 
     

    -o заставляет grep печатать только совпадающая часть строки. \ K - это конструкция PCRE, которая означает «игнорировать все, что было найдено до этой точки».

  2. sed

     $ sed -n 's /.* mark: \ s * \ ([0-9] \ + \). * / \ 1 / p' file 
    98 {{1 }} 

    -n подавляет нормальный вывод. p в конце заставляет sed печатать только в том случае, если подстановка прошла успешно. Само регулярное выражение захватывает строку чисел, следующую за меткой : и 0 или более символов пробела, и заменяет всю строку тем, что было захвачено.

  3. 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 читает все сразу.

3
28.11.2017, 11:13
0 ответов

Теги

Похожие вопросы