grep's -o
выводит только совпадения, игнорируя строки; wc
может их подсчитать:
grep -io "nicolas bomber" annuaire | wc -l
или просто,
grep -ioc "nicolas bomber" annuaire
Как вы прокомментировали, вы можете найти любое количество пробелов между словами, используя опцию -z
,
grep -iz "nicolas[[:space:]]*bomber" annuaire | wc -l
Из man grep
-i, --ignore-case
Ignore case distinctions in both the PATTERN and the input files. (-i is specified by POSIX.)
-o, --only-matching
Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.
-c, --count
Suppress normal output; instead print a count of matching lines for each input file.
Альтернативно, если вы хотите искать строку в конкретном расширении файла, например, скажем, все *. txt
файлы, вы можете использовать:
grep -R --include='*.txt' -ioc "nicolas bomber" .
Вы обнаружили ошибку. И при этом неприятный.
Семейство команд макета
, похоже, зависит от управляющего терминала (для работы команды должен присутствовать TTY или PTS). Я могу воспроизвести проблему, не просматривая crontab
:
Я добавляю следующее к моему .screenrc
:
layout new lay1
split -v
layout new lay2
split -v
layout attach lay2
Запуск экран
напрямую дает мне макет :
screen
Но выполнение следующего не может найти макеты :
screen -dm && screen -r
В последней команде я все еще могу перечислить макеты, используя : layout show
, но, черт возьми, теперь это когда ошибка становится неприятной. Если я попытаюсь изменить макет (с помощью : layout next
или : layout prev
), экран попадет в бесконечный цикл.
Более того, поскольку двоичный файл screen
в моей системе является корнем SUID (мне нужна многопользовательская поддержка), ошибка становится еще хуже. После того, как пользовательский процесс был убит, корневой процесс запускает бесконечный цикл и в конечном итоге дает сбой. Возможность сбоя процесса SUID или даже просто возможность создания нескольких корневых процессов, высасывающих ресурсы ЦП в бесконечных циклах, очень опасна.
Я тестировал его на вашей версии экрана (4.3.0), а также на 4.5.0 (последняя версия), где ошибка все еще существует. Я собираю исходный код с помощью -DDEBUG
и сообщаю об ошибке команде разработчиков screen. Экран -DDEBUG
дает сбой:
ASSERT(l->l_cvlist != cv) failed file canvas.c line 294
Следовательно, вероятно, что бесконечный цикл пытается найти что-то в этом связанном списке и снова и снова дает сбой.
позволяет привязать
метод eval
. Поэтому вы можете добавить в свой .screenrc
что-то вроде:
bind g eval 'layout new default' 'split -v' 'resize 60%' 'split -h' 'layout select default'
Хакерская часть состоит в том, что должен быть в одной строке, screen не имеет никакого способа экранировать длинные строки в .screenrc
. Затем вы можете получить макет одним (а точнее, двойным) нажатием клавиши после выхода на экран ( Ctrl + a g ).
g обычно привязан к системному звонку, поэтому вы не должны пропустить его. Но вы можете привязать любую понравившуюся клавишу.