Иногда нужно найти файлы, содержащие определенный текст. В современный системах для рабочих станций вовсю используются утилиты из разряда Desctop Search, которые индексируют все документы и затем предоставляют возможность быстро найти искомый файл. В Linux сервере для этого можно использовать команду grep.
Используем grep для поиска текста
grep “text string” directory
При выполнении данной команды grep будет искать строку text string во всех файлах в директории directory
Примеры использования grep
$ grep "redeem reward" /home/tom/*.txt
Как найти текст во всех подкаталогах
grep позволяет искать в подкаталогах, используя опцию -r:
$ grep -r "redeem reward" /home/tom
Вывести только имена найденных grep файлов
Чтобы grep вывела имена найденных файлов, стоит использовать опцию -H.
sudo grep -Hr pure-ftpd /etc/
Вывод:
... /etc/rc2.d/S20pure-ftpd:# Provides: pure-ftpd /etc/rc2.d/S20pure-ftpd:# pure-ftpd starts and stops the pure-ftpd ftp daemon /etc/rc2.d/S20pure-ftpd:NAME=pure-ftpd /etc/rc2.d/S20pure-ftpd:WRAPPER=/usr/sbin/pure-ftpd-wrapper /etc/rc2.d/S20pure-ftpd:PIDFILE=/var/run/pure-ftpd/pure-ftpd.pid /etc/rc2.d/S20pure-ftpd:SUFFIX=`basename $ME | sed -ne 's/^pure-ftpd-\(.*\)/\1/p'` /etc/rc2.d/S20pure-ftpd: DAEMON=/usr/sbin/pure-ftpd-$SUFFIX ...
Теперь нужно прогнать вывод через фильтр, чтобы оставить только имена файлов, в которых есть вхождение текста, а также удалить дубликаты. Нужно использовать такую команду:
sudo grep -Hr pure-ftpd /etc/ | cut -d: -f1 | sort -u
Вывод:
grep: /etc/blkid.tab: No such file or directory /etc/default/pure-ftpd-common /etc/ftpallow /etc/init.d/pure-ftpd /etc/logrotate.d/pure-ftpd-common /etc/pam.d/pure-ftpd /etc/pure-ftpd/conf/AltLog /etc/pure-ftpd/conf/PureDB /etc/rc0.d/K20pure-ftpd /etc/rc1.d/K20pure-ftpd /etc/rc2.d/S20pure-ftpd /etc/rc3.d/S20pure-ftpd /etc/rc4.d/S20pure-ftpd /etc/rc5.d/S20pure-ftpd /etc/rc6.d/K20pure-ftpd
спасибо! :]
А как искать только в файлах определенного типа, например «.php».
На примере этой команды:
sudo grep -Hr pure-ftpd /etc/ | cut -d: -f1 | sort -u
sudo grep -Hr pure-ftpd /etc/*.php | cut -d: -f1 | sort -u
А как искать во всех файлах, кроме *.php?…
grep -v «pure-ftpd» /etc/*.php
опция -l не подойдет?
Всё никак не могу понять, как в Linux можно найти все файлы в директории содержащие строку со словами «World» и «My»….
grep -r -E ‘My.*World|World*My’ /var/log/
Вот так пишу. Что не так?