Как сделать несколько шаблонов grep, чтобы найти значение в захваченной строке

#regex #grep

Вопрос:

Я пытаюсь выполнить несколько шаблонов grep, чтобы найти число в захваченной строке.

У меня есть такой текстовый файл:

 This is the first sample line 1
this is the second sample line
another line

total lines: 3 tot
 

Я пытаюсь найти способ получить только общее количество строк. Таким образом, вывод здесь должен быть «3».

Вот то, что я пробовал:

 grep "total lines: [0-9]" myfile.txt
grep "total lines" myfile.txt | grep "[0-9]"
 

Комментарии:

1. grep "total lines: [0-9]*" myfile.txt | cut -d ' ' -f3

2. С GNU grep: grep -Po "total lines: K[0-9]*" myfile.txt сделает свое дело

3. @Jetchisel : Звездочка здесь не нужна, так cut как в любом случае получает всю строку.

Ответ №1:

Вы могли бы использовать sed :

 sed -En 's/^total lines: ([0-9] ).*/1/p' myfile.txt
 
  • -E расширенные регулярные выражения
  • -n подавить автоматическую печать
  • Совпадение ^total lines: ([0-9] ).* (зафиксируйте номер)
  • 1 замените всю строку захваченным номером
  • p распечатайте результат

Ответ №2:

1-е решение: Используя GNU grep , попробуйте следующее. Простое использование -o опции для печати только совпадающего значения -P включает регулярное выражение PCRE для программы. Затем в регулярном выражении сопоставьте часть ^total lines: , начиная с каждой строки, и если найдено совпадение, затем отбросьте совпадающие значения по K опции(чтобы удалить их из ожидаемого вывода), за которой следует 1 или более цифр, используя положительный взгляд вперед, чтобы убедиться, что за ним следует пробел(ы) здесь.

 grep -oP '^total lines: K[0-9] (?=s tot)' Input_file
 

2-е решение: С показанными вами образцами, пожалуйста, попробуйте следовать awk . Это можно было бы сделать за один awk раз. Поиск строки, в которой есть строка /total lines: / , а затем печать 2-го последнего поля этой строки.

 awk '/total lines: /{print $(NF-1)}' Input_file
 

3-е решение: awk Использование match функции здесь. Сопоставление total lines: [0-9] tot , а затем замена всего, кроме цифр, нулем в совпадающих значениях.

 awk 'match($0,/total lines: [0-9]  tot/){val=substr($0,RSTART,RLENGTH);gsub(/[^0-9] /,"",val);print val}' Input_file
 

Ответ №3:

Вам обязательно использовать grep?

 $ echo myfile.txt | wc -l
 

Если вы имеете в виду, что в файле есть строка в формате

всего строк: 3 всего

Затем обратитесь к https://unix.stackexchange.com/questions/13466/can-grep-output-only-specified-groupings-that-match и используйте что-то вроде:

 grep -Po 'total lines: Kd ' myfile.txt
 

Примечания:

  1. Регулярное выражение Perl не является моей сильной стороной, поэтому часть dw может не сработать.
  2. Это может быть выполнимо без-P, но я не могу протестировать с этого компьютера с Windows.
  3. regex101.com помог мне протестировать приведенную выше строку, так что это может сработать.

Ответ №4:

Проблема с использованием шаблона последней строки и применением grep/sed для поиска шаблона заключается в том, что если какая-либо строка в файле содержит такой шаблон, вам придется применить некоторую дополнительную логику для фильтрации. например, рассмотрим случай ниже входного файла.

 line001
total lines: 883 tot
This is the first sample line 1
this is the second sample line
another line

total lines: 883 tot
 

Предполагая, что формат вашего файла постоянен (т. Е. Вторая последняя строка будет пустой, а последняя строка будет содержать общее количество), вместо использования любых команд сопоставления с образцом вы можете напрямую подсчитать количество строк, используя команду awk ниже.

 awk 'END { print NR - 2 }' myfile.txt
 

Ответ №5:

Вы можете использовать следующее awk , чтобы получить третье поле в строке, которая начинается с total count: и прекратить дальнейшую обработку файла:

 awk '/^total lines:/{print $3; exit}' file
 

Посмотрите эту онлайн-демонстрацию.

Вы можете использовать следующую GNU grep :

 # Extract a non-whitespace chunk after a certain pattern
grep -oP '^total lines:s*KS ' file

# Extract a number after a pattern
grep -oP '^total lines:s*Kd (?:.d )?' file
 

Посмотрите онлайн-демонстрацию. Подробные сведения:

  • ^ — начало строки
  • total lines: — буквальная строка
  • s* — любые символы с нулем или более пробелов
  • K — оператор сброса соответствия отбрасывает весь текст, сопоставленный до сих пор
  • S — один или несколько символов без пробелов
  • d (?:.d )? — одна или несколько цифр, а затем необязательная последовательность . и одна или несколько цифр.

Смотрите демонстрацию регулярных выражений.