рекурсивный поиск шаблона, затем для каждого соответствия распечатывают определенную ПОСЛЕДОВАТЕЛЬНОСТЬ: номер строки, имя файла и никакое содержание файла

/etc/init.d сохраняется на человечности для обратной совместимости с материалом sysvinit. Если Вы на самом деле смотрите на /etc/init.d/rc.local Вы будете видеть (также с 12.04 Серверов LTS):

#! /bin/sh
### BEGIN INIT INFORMATION
# Provides:          rc.local
# Required-Start:    $remote_fs $syslog $all
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Run /etc/rc.local if it exist
### END INIT INFO

И "Выполненный/etc/rc.local" точно, что он делает. Полнота /etc/rc.local :

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

exit 0

Я предположил бы цель в выполнении, это должно обеспечить, очень простое место для помещения оболочки управляет, чтобы Вы хотели выполненный при начальной загрузке, не имея необходимость иметь дело с stop|start сервисным материалом, который находится в /etc/init.d/rc.local.

Таким образом, это - на самом деле сервис и может быть выполнено как таковое. Я добавил a echo строка к /etc/rc.local и:

»service rc.local start
hello world

Однако я не полагаю, что на это ссылается что-либо в выскочке /etc/init (не init.d!) каталог:

»initctl start rc.local
initctl: Unknown job: rc.local

В выскочке существует несколько "емкостно-резистивных" сервисов:

»initctl list | grep rc
rc stop/waiting
rcS stop/waiting
rc-sysinit stop/waiting

Но ни один из тех, кажется, не имеет никакого отношения к rc.local.

6
13.04.2017, 15:36
2 ответа

Используя grep

Почему Вы не можете просто использовать -r переключатель к grep рекурсивно вызывать файловую систему вместо использования find? Существует 2 дополнительных переключателя, которые я использовал бы также, вместо -n переключатель.

$ grep -rHn PATTERN <DIR> | cut -d":" -f1-2

Пример № 1

$ grep -rHn PATH ~/.bashrc | cut -d":" -f1-2
/home/saml/.bashrc:25

Подробнее

  • -r - рекурсивно переройте файлы + каталоги
  • -H - печатает название файла, если это соответствует (менее строгий, чем -l) т.е. это работает с grepдругие переключатели
  • -n - отобразите номер строки соответствия

Пример № 2

$ grep -rHn PATH ~/.bash* | cut -d":" -f1-2
/home/saml/.bash_profile:10
/home/saml/.bash_profile:12
/home/saml/.bash_profile_askapache:99
/home/saml/.bash_profile_askapache:101
/home/saml/.bash_profile_askapache:118
/home/saml/.bash_profile_askapache:166
/home/saml/.bash_profile_askapache:218
/home/saml/.bash_profile_askapache:250
/home/saml/.bash_profile_askapache:314
/home/saml/.bash_profile_askapache:2317
/home/saml/.bash_profile_askapache:2323
/home/saml/.bashrc:25

Используя находку

$ find . -exec sh -c 'grep -Hn PATTERN "$@" | cut -d":" -f1-2' {}  +

Пример

$ find ~/.bash* -exec sh -c 'grep -Hn PATH "$@" | cut -d":" -f1-2' {}  +
/home/saml/.bash_profile:10
/home/saml/.bash_profile:12
/home/saml/.bash_profile_askapache:99
/home/saml/.bash_profile_askapache:101
/home/saml/.bash_profile_askapache:118
/home/saml/.bash_profile_askapache:166
/home/saml/.bash_profile_askapache:218
/home/saml/.bash_profile_askapache:250
/home/saml/.bash_profile_askapache:314
/home/saml/.bash_profile_askapache:2317
/home/saml/.bash_profile_askapache:2323
/home/saml/.bashrc:25

Если Вы действительно хотите использовать find можно сделать что-то вроде этого должностному лицу grep после нахождения использования файлов find.

4
27.01.2020, 20:27
  • 1
    Вы получаете меньше контроля с grep, в особенности он проходит символьные ссылки (попытка grep -r something /etc на Debian/Ubuntu и плачут). –  Gilles 'SO- stop being evil' 17.10.2013, 02:54
  • 2
    @Gilles - спасибо, я добавлю a find пример также. –  slm♦ 17.10.2013, 02:56
  • 3
    OP также касался разделителя, вкладываемого в именах файлов - таким образом, сокращение не могло бы работать. Иначе, хороший. –  ChuckCottrill 17.10.2013, 04:08
  • 4
    @JohnSonderson - каждый тест я могу забеременеть, я произвожусь как это от grep: "Вздор grep-rHn $1 1/1/1/1.txt:1:blah" –  slm♦ 17.10.2013, 16:05
  • 5
    @JohnSonderson - относительно использования -H это вызывает grep всегда печатать имя файла. При предоставлении grep единственное имя файла это не печатает название файла в выводе. –  slm♦ 17.10.2013, 16:12
grep -n PATTERN `find . -type f`

Это плохо, потому что вывод замены команды интерпретируется как разделенный от пробела список подстановочных шаблонов имени файла. Если какие-либо из имен файлов содержат пробел или один из \[*?, этот отрывок не работает. Кроме того, если будет много файлов соответствия, то это в конечном счете приведет к командной строке, которая является слишком длинной.

find . -exec grep -n PATTERN  '{}' \;

Это прекрасно и надежно, но grep вызывается однажды на файл. Поэтому это настолько медленно.

Использовать -exec … {} + выполнить команду в пакетах как можно большего количества файлов. Обратите внимание, что это могло произойти, что последний пакет (или в других теории) состоит из единственного файла, таким образом, grep не распечатает имя файла; передайте -H опция всегда распечатать имя файла или добавить аргумент /dev/null (который никогда не содержит соответствий, но гарантирует это grep видит по крайней мере два имен файлов).

find . -type f -exec grep -Hn PATTERN {} +

GNU grep не имеет опции распечатать числа согласующего отрезка длинной линии, но не текст согласующего отрезка длинной линии. Можно разделить совпавший текст и подкачать номера строки с именем файла с sed.

find . -type f -exec grep -Hn PATTERN {} + | sed 's/^\([^:]*\):\([^:]*\):.*/\2:\1/'

Если Вы хотите к выравниванию по правому краю, номера строки, awk намного более прост, чем какая-либо альтернатива, о которой я могу думать.

find . -type f -exec grep -Hn PATTERN {} + | awk -F : '{printf "%8d:%s", $2, $1}'

Можно получить больше контроля путем выполнения соответствия в awk вместо grep. Awk склонен быть немного медленнее, потому что это - больше универсального инструмента с интерпретируемым языком. Одно преимущество - то, что можно выбрать, что сделать с именами файлов, содержащими двоеточие или новую строку, которые приводят к неоднозначному выводу от grep. Следующий отрывок использует awk, чтобы сделать поиск и справляется с именами файлов, содержащими : (и даже новые строки, но для них это производит неоднозначный вывод). Обратите внимание, что awk использует расширенные регулярные выражения, как grep -E (с незначительными изменениями, но не действительно больше, чем Вы добираются между реализациями grep или awk).

find . -type f -exec awk '/PATTERN/ {printf "%d:", FNR; print FILENAME}' {} +
4
27.01.2020, 20:27
  • 1
    Ваше объяснение относительно того, почему вторая опция является настолько медленной, является очень четким.Спасибо. Относительно флага-H, говорится в моей странице справочника, "Печатают имя файла для каждого соответствия. Это - значение по умолчанию, когда существует больше чем один файл для поиска". Таким образом, кажется, что это не могло бы быть необходимо. Я не знаю, почему, но страница справочника не указывает то, что происходит в случае, где существует только один файл для соответствия, возможно, кто-то может прокомментировать. –  John Sonderson 17.10.2013, 15:39
  • 2
    Относительно вызова awk таким образом, возможно, я не был ясен, но если разделитель полей (указал после-F), который является двоеточием (:), появляется в имени файла, которое печатается перед номером строки, затем Ваша команда с помощью awk, не будет работать. –  John Sonderson 17.10.2013, 15:40
  • 3
    @JohnSonderson”-h, --no-filename Подавите добавление префикса имен файлов на выводе. Это - значение по умолчанию, когда существует только один файл (или только стандартный вход) для поиска “. Если Вы хотите корректный вывод для имен файлов, содержащих двоеточия, Вы не можете использовать grep, не без сложной обертки оболочки. Можно использовать awk, видеть мое редактирование. –  Gilles 'SO- stop being evil' 17.10.2013, 16:02

Теги

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