Как я могу извлечь имя файла из результата grep? - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь получить список всех программ, выполняемых при запуске системы.

Мой план игры следующий:

  • grep -r /etc/init.d и /etc/rc.d/* directoryies
  • Поиск любой строки, которая явно начинается с "/"
  • Включает выполнение из обратных символов и $ ()
  • Предполагается, что выполнение выполняется путем указания полного пути и игнорирования относительноговыполнение пути (то есть ./...)

Для этого я использовал следующее:

egrep -r '^\s*/|\$\(\s*/|\`\s*/' /etc/rc.d/* /etc/init.d

Поскольку он ищет файлы в каталогах, список результатов показывает файл, в котором он находилсянашел в и полную строку.Я хотел бы теперь передать результаты во что-то, чтобы получить только имя файла и канал, в sort|uniq, чтобы получить упрощенный список.Я думаю, что могу как-то использовать awk, но я не очень знаком с ним.

Пример Результат:

/etc/init.d/foo:             foo=$(/bin/echo hello)
/etc/init.d/bar:             bar=$(/bin/echo world)
/etc/rc.d/init.d/foobar:     /bin/false

Желаемый результат:

/bin/echo
/bin/false

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

ОК, благодаря помощи alb3rtobr я смог получить его:

egrep -hor '(^\s*/|\$\(\s*/|\`\s*/)[^ ]*' /etc/rc.d/* /etc/init.d | sed -e 's/\($(\|)\|^\s*\)//g' | sort | uniq  

Я изменил egrep, чтобы продолжить сопоставление, пока не встретил пробел, а затем добавил опцию -o, чтобы вернуть толькосогласованный образец.Я также изменил sed, чтобы обрезать ведущие пробелы.

РЕДАКТИРОВАТЬ: изменено, чтобы соответствовать шаблону, а не пробел

0 голосов
/ 21 декабря 2018

Если вы добавите опцию -h к egrep, имя файла не будет отображаться.

egrep -hr '^\s*/|\$\(\s*/|\`\s*/' /etc/rc.d/* /etc/init.d | sed -e 's/\($(\|)\)//g'

Это регулярное выражение sed удалит все "$ (" и ")"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...