Я использую скрипт для регулярной загрузки моих сообщений gmail, которые сжимают необработанные .eml в файлы .gz. Сценарий создает папку для каждого дня, а затем сжимает каждое сообщение в свой собственный файл.
Я хотел бы найти в этом архиве «строку».
Один Grep, похоже, не делает этого. Я также попробовал SearchMonkey.
zgrep
:zgrep - search possibly compressed files for a regular expression
Ответы:
Если вы хотите рекурсивно выполнять grep во всех файлах .eml.gz в текущем каталоге, вы можете использовать:
Вы должны убежать от первого,
*
чтобы оболочка не интерпретировала его.-print0
говорит find для печати нулевого символа после каждого найденного файла;xargs -0
читает из стандартного ввода и запускает команду после него для каждого файла;zgrep
работает какgrep
, но сначала распаковывает файл.источник
zgrep
на самом деле кажется быстрее, чемgrep
работать с несжатыми файлами. Это должно быть потому, что сжатые файлы могут быть прочитаны с жесткого диска и распакованы быстрее, чем чтение несжатого файла с жесткого диска.xargs
использует пробелы (пробелы). Конечно, в файлах почти никогда не бывает символов новой строки, но пробелы не являются неслыханными (даже если большинство типов UNIXy недовольны ими). Тем не менее, вы можете упростить, не беспокоясь о пробелах, еще проще:find . -name '*.eml.gz' -exec zgrep "STRING" {} +
это получает столько же аргументов за запускxargs
, безопасность-print0
/-0
и все без дополнительных затрат на запуск и процессирование процесса, и довольно лаконично.-exec
with+
- это POSIX, поэтому, насколько мне известно, это должно быть в большинстве последних UNIX-подобных систем.ABCLog04_18_18_2_21.gz
Есть ли способ рекурсивного поиска файлов, начинающихся с ABC *. Я попытался заменить\*.eml.gz
в вашем примере выше наABCLog*
и получить ошибку о формате файла .:find: paths must precede expression: ABCLog-2018-03-12-10-16-1.log.gz Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
Здесь много путаницы, потому что ее нет
zgrep
. У меня есть две версии в моей системе,zgrep
изgzip
иzgrep
изzutils
. Первый - это просто скрипт-обертка, который вызываетgzip -cdfq
. Он не поддерживает-r, --recursive
переключатель. 1Последняя представляет собой
c++
программу , и она поддерживает в-r, --recursive
опции.Запуск
zgrep --version | head -n 1
покажет, какой из них (если есть) является значением по умолчанию:это скрипт-обертка,
это
cpp
исполняемый файл.Если у вас есть последний, вы можете запустить:
В любом случае, как и предполагалось,
find
+zgrep
будет одинаково хорошо работать с любой версиейzgrep
:Если
zgrep
отсутствует в вашей системе (очень маловероятно), вы можете попробовать с:но есть существенный недостаток: вы не будете знать, где находятся совпадения, так как к совпадающим строкам нет имени файла.
1: потому что это было бы проблематично
источник
zgrep
zutils недоступен, вы можете установить его в Ubuntu с помощьюsudo apt-get install zutils
.grep -n
,zgrep -n
напечатает no.s. линии Это в руководстве ...ag
это вариантgrep
, с некоторыми приятными дополнительными функциями.Так:
Если не установлен,
источник
ag: truncated file: Success
в результате. Любой другой флаг я должен добавить?Одна рекурсия легка:
Однако для сжатых файлов вам нужно что-то вроде:
path/to/directory
должен быть родительским каталогом, который содержит подкаталоги для каждого дня.zgrep
это очевидный ответ, но, к сожалению, он не поддерживает-r
флаг. Отman zgrep
:источник
Если ваша система имеет zgrep, вы можете просто
zgrep -irs your-pattern-goes-here the-folder-to-search-goes-here/
Если в вашей системе нет zgrep, вы можете использовать команду find для запуска zcat и grep для каждого файла следующим образом:
find the-folder-to-search-goes-here/ -name '*.gz' \ -exec sh -c 'echo "Searching {}" ; zcat "{}" | grep your-pattern-goes-here ' \;
источник
Searching ~/gmvault-db/db/2015-02/03/whatever.gz
zgrep
не возьму-r
флаг по какой-то причине. Это упоминание вman zgrep
(также см. Мой ответ).xzgrep является производной от утилит zgrep (less / bin / xzgrep)
Со страницы Man:
-l распечатать соответствующее имя файла
-R для рекурсии не будет работать, так как это специально запрещено в скрипте, однако простое перетаскивание оболочки должно привести нас туда
из относительного пути, где ./today/sample.eml.gz, совпадают во всех экземплярах, которые находятся на один уровень ниже нашего относительного положения в оболочке, что заканчивается на «.eml.gz»
источник