Я хочу запустить ack или grep для файлов HTML, которые часто содержат очень длинные строки. Я не хочу видеть очень длинные строки, которые повторяются постоянно. Но я действительно хочу видеть только ту часть длинной строки, которая окружает строку, соответствующую регулярному выражению. Как я могу получить это, используя любую комбинацию инструментов Unix?
90
ack
? Вы используете эту команду, когда вам что-то не нравится? Что-то вродеack file_with_long_lines | grep pattern
? :-)ack
(известный какack-grep
Debian) принимаетgrep
стероиды. Тоже есть--thpppt
опция (не шучу). betterthangrep.com--thpppt
функция несколько спорна, главное преимущество , кажется, что вы можете использовать Perl регулярных выражений непосредственно, а не какие - то сумасшедшее[[:space:]]
и символы , такие как{
,[
и т.д. изменяя смысл с-e
и-E
переключается таким образом , что это невозможно запомнить.Ответы:
Вы можете использовать опцию grep
-o
, возможно, в сочетании с изменением вашего шаблона на".{0,10}<original pattern>.{0,10}"
, чтобы увидеть некоторый контекст вокруг него:..или
-c
:источник
$ echo "eeeeeeeeeeeeeeeeeeeeqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwwwrrrrrrrrrrrrrrrrrrrrr" > fileonelongline.txt && grep -oE ".{0,20}MYSTRING.{0,20}" ./fileonelongline.txt
распечаткиqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwww
oE ".{0,20}mysearchstring.{0,20}"
вы теряете выделение внутренней «исходной» строки по отношению к контексту, потому что все это становится шаблоном поиска. Хотел бы найти способ сохранить некоторый невыделенный контекст вокруг результатов поиска для гораздо более легкого визуального сканирования и интерпретации результатов.-oE ".{0,x}foo.{0,x}"
подхода (гдеx
- количество символов контекста) - добавить `| grep foo `до конца. Работает как с решениями ack, так и с grep. Другие решения также здесь: unix.stackexchange.com/questions/163726/…Сообщите о своих результатах
cut
. Я также подумываю добавить--cut
переключатель, чтобы вы могли сказать--cut=80
и получить только 80 столбцов.источник
| cut=c1-120
к grep, сработал для меня (хотя не знаю, как обрезать совпадающий текст)| cut=c1-120
не сработало для меня, мне нужно было сделать| cut -c1-120
| cut -c 1-100
stackoverflow.com/a/48954102/1815624--no-wrap
опции, которая использует$COLUMNS
?Вы можете использовать less в качестве пейджера для подтверждения и вырезания длинных строк:
ack --pager="less -S"
это сохраняет длинную строку, но оставляет ее на одной строке вместо переноса. Чтобы увидеть большую часть строки, прокрутите влево / вправо меньше с помощью клавиш со стрелками.Для этого у меня есть следующий псевдоним:
источник
--pager
команду в свой файл ~ / .ackrc, если хотите всегда использовать ее.ack
.ack
почти такой жеgrep
, только проще в самых распространенных случаяхполучает символы от 1 до 100.
источник
Взято из: http://www.topbug.net/blog/2016/08/18/truncate-long-matching-lines-of-grep-a-solution-that-preservations-color/
Предлагаемый подход
".{0,10}<original pattern>.{0,10}"
идеален, за исключением того, что цвет подсветки часто путается. Я создал сценарий с аналогичным выводом, но цвет также сохранился:#!/bin/bash # Usage: # grepl PATTERN [FILE] # how many characters around the searching keyword should be shown? context_length=10 # What is the length of the control character for the color before and after the # matching string? # This is mostly determined by the environmental variable GREP_COLORS. control_length_before=$(($(echo a | grep --color=always a | cut -d a -f '1' | wc -c)-1)) control_length_after=$(($(echo a | grep --color=always a | cut -d a -f '2' | wc -c)-1)) grep -E --color=always "$1" $2 | grep --color=none -oE \ ".{0,$(($control_length_before + $context_length))}$1.{0,$(($control_length_after + $context_length))}"
Предполагая, что сценарий сохранен как
grepl
, тогдаgrepl pattern file_with_long_lines
должны отображаться совпадающие строки, но только с 10 символами вокруг соответствующей строки.источник
Вот что я делаю:
В моем .bash_profile я переопределяю grep, чтобы он автоматически запускался
tput rmam
до иtput smam
после, что отключило перенос, а затем снова включило его.источник
В необычной ситуации, когда вы не можете использовать
-E
, вы можете использовать:источник
Я вложил в свой
.bashrc
:Затем вы можете использовать
grepl
в командной строке любые аргументы, доступные дляgrep
. Используйте клавиши со стрелками, чтобы увидеть хвост более длинных линий. Используйтеq
для выхода.Пояснение:
grepl() {
: Определите новую функцию, которая будет доступна в каждой (новой) консоли bash.$(which grep)
: Получить полный путьgrep
. (Ubuntu определяет псевдонимgrep
, эквивалентныйgrep --color=auto
. Нам нужен не этот псевдоним, а оригиналgrep
.)--color=always
: Раскрасить вывод. (--color=auto
из псевдонима не будет работать, так какgrep
обнаруживает, что вывод помещен в канал, и не будет его раскрашивать.)$@
: Поместитеgrepl
сюда все аргументы, данные функции.less
: Отобразить строки с помощьюless
-R
: Показать цветаS
: Не разрывайте длинные строкиисточник