#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
Примечания:
- Регулярное выражение Perl не является моей сильной стороной, поэтому часть dw может не сработать.
- Это может быть выполнимо без-P, но я не могу протестировать с этого компьютера с Windows.
- 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 )?
— одна или несколько цифр, а затем необязательная последовательность.
и одна или несколько цифр.
Смотрите демонстрацию регулярных выражений.