The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Поиск строк в файлах"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"Поиск строк в файлах"  +/
Сообщение от Refraction (ok) on 15-Мрт-10, 15:04 
День добрый.
Столкнулся с небольшой проблемой при написании bash-скрипта, от которого требуется след:
вывести все файлы и размер этих файлов, в которых встречается задананная пользователем строка. Суть проблемы в том, что не хочет у меня скрипт правильно читать каталоги или файлы, в которых есть пробелы:
for i in $( find $2); do
if [ `grep $1 $i -l -s` ];then
echo $i $(filesize $i)
fi
done
Если я загоняю выражение $(find $2) в двойные ковычки, то скрипт загоняет в i одной строкой сразу все найденные пути.
Пытался делать через
find $2 -exec grep $1 -l -s '{}' \;
Но не знаю, как сделать вывод еще и размера для каждого найденного файла.
Стыдно конечно, что обращаюсь за помощью с такой простой задачей, но у меня идеи кончились =\
Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Поиск строк в файлах"  +/
Сообщение от phpcoder email(??) on 15-Мрт-10, 15:12 
fgrep -rl text test111 | xargs du -sh


Как-нибудь так попробуйте.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

2. "Поиск строк в файлах"  +/
Сообщение от Refraction (ok) on 15-Мрт-10, 15:39 
>fgrep -rl text test111 | xargs du -sh
>
>
>Как-нибудь так попробуйте.

Файлы находит, но при передаче результата в du снова рвется путь

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

3. "Поиск строк в файлах"  +/
Сообщение от sproot (ok) on 15-Мрт-10, 16:05 
>>fgrep -rl text test111 | xargs du -sh
>>
>>
>>Как-нибудь так попробуйте.
>
>Файлы находит, но при передаче результата в du снова рвется путь

sproot@matrix:tmp$ find 1/
1/
1/tst te
sproot@matrix:tmp$ fgrep -rlZ 123 1/ | xargs -0 du -sbh
4       1/tst te
sproot@matrix:tmp$                    

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

4. "Поиск строк в файлах"  +/
Сообщение от Refraction (ok) on 15-Мрт-10, 17:59 
>sproot@matrix:tmp$ find 1/
>1/
>1/tst te
>sproot@matrix:tmp$ fgrep -rlZ 123 1/ | xargs -0 du -sbh
>4       1/tst te
>sproot@matrix:tmp$

Спасибо огромное. Работает отлично.
Только есть вопрос маленький: что делает опция -0 ?
Как я понял, grep -Z добавляет после каждого пути к файлу маркер конца строки в виде нуля. xargs -0 читает входное значение, пока не наткнется на 0 и уже после этого передает в du ?

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

5. "Поиск строк в файлах"  +/
Сообщение от sproot (ok) on 16-Мрт-10, 02:34 
>[оверквотинг удален]
>>sproot@matrix:tmp$ fgrep -rlZ 123 1/ | xargs -0 du -sbh
>>4       1/tst te
>>sproot@matrix:tmp$
>
>Спасибо огромное. Работает отлично.
>Только есть вопрос маленький: что делает опция -0 ?
>Как я понял, grep -Z добавляет после каждого пути к файлу маркер
>конца строки в виде нуля. xargs -0 читает входное значение, пока
>не наткнется на 0 и уже после этого передает в du
>?

Да, верно. fgrep -Zl терминирует имя файла нулевым символом, а xargs -0 умеет читать такие строки. Это необходимо когда входящий поток для команды xargs содержит пробелы, кавычки или слеши.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

6. "Поиск строк в файлах"  +/
Сообщение от Refraction (ok) on 23-Мрт-10, 14:16 
Господа, помогите этот скрипт, чтобы в случае ошибки открытия файла или папки выдавалась ошибка, но не силами самой функции, а вручную через условие

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

7. "Поиск строк в файлах"  +/
Сообщение от Refraction (ok) on 23-Мрт-10, 19:24 
Как я понимаю, передать параметр через xargs в целый блок с условиями невозможно?
В таком случае надо переписывать через цикл, в котором уже будут проверки на условия. Но опять таки встает вопрос, как передать в $i полную строку пути, чтобы она не разбивалась пробелами. А вот как так сделать моих знаний не хватает(
Очень прошу помощи)
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

8. "Поиск строк в файлах"  +/
Сообщение от sproot (ok) on 24-Мрт-10, 14:05 
>Как я понимаю, передать параметр через xargs в целый блок с условиями
>невозможно?

Возможно. Пример:
seq 1 10 | xargs -n 1 -i sh -c 'if [ -n {} ] ; then echo "Number {}"; fi'

>В таком случае надо переписывать через цикл, в котором уже будут проверки
>на условия. Но опять таки встает вопрос, как передать в $i
>полную строку пути, чтобы она не разбивалась пробелами. А вот как
>так сделать моих знаний не хватает(
>Очень прошу помощи)

Если не изменяет память, можно временно объявить IFS='' перед циклом, а потом восстановить дефолтное значение.
Из man bash:
...
IFS    The Internal Field Separator that is used for word splitting after expansion and to  split  lines
              into words with the read builtin command.  The default value is ‘‘<space><tab><newline>’’.
...

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру