LINUX.ORG.RU

Применить ко всем файлам в директории команду и отформатировать вывод

 , ,


0

1

Нужна помощь bash джедаев.

Суть задачи. Есть куча библиотек, мне нужно просмотреть их все на наличие определённого символа. Информация извлекается с помощью команды nm:

$ nm -g lib_hidefog.so
0000db68 B __bss_end__
0000db68 B _bss_end__
0000d7f0 B __bss_start
0000d7f0 B __bss_start__
         w __cxa_finalize
0000203c T DehazeExtRegsDefault
00002104 T DehazeRegsDefault
00002320 T DehazeRegsUpdate
00002e50 T ISP_AlgRegisterDehaze
Далее нужно отфильтровать по искомому символу, например:
$ nm -g lib_hidefog.so | grep ISP_AlgRegisterDehaze 
00002e50 T ISP_AlgRegisterDehaze
И теперь загвоздка. Нужно сделать скрипт на bash, который будет просматривать библиотеки. И если символ найден, то выводил имя файла и результат grep.

Пробовал так, но имя файл съедается:

$ find . -iname '*.so' -exec sh -c 'echo "{}" ; nm -g "{}"' \; | grep ISP_AlgRegisterDehaze

★★★★★

man nm:

OPTIONS

-A
-o
--print-file-name
    Precede each symbol by the name of the input file (or archive member) in
    which it was found, rather than identifying the input file once only,
    before all of its symbols.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Спасибо, это работает в случае nm.

Но подобные задачи бывают нужны для других утилит, например objdump, readelf и т.д. Хотелось бы не зависеть от опций конкретной утилиты.

ox55ff ★★★★★
() автор топика
Ответ на: комментарий от ox55ff

Самое простое это поместить grep внутрь команды find:

find . -iname '*.so' -exec sh -c 'echo "{}" ; nm -g "{}" | grep ISP_AlgRegisterDehaze' \;
Ещё можно оставлять два типа строк:
find . -iname '*.so' -exec sh -c 'echo "FILE: {}" ; nm -g "{}"' \; | egrep '^FILE: |'ISP_AlgRegisterDehaze

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Самое простое это поместить grep внутрь команды find:

Наверное вы это имели в виду:

find . -iname '*.so' -exec sh -c 'nm -g "{}" | grep -q SYMBOL && echo "{}"' \;
vodz ★★★★★
()
Ответ на: комментарий от ox55ff

Не, подавлять вывод не нужно.

Это уже ваши тараканы, речь вообще была о простой печати имени файла только после успешного поиска.

vodz ★★★★★
()
Ответ на: комментарий от vodz

И если символ найден, то выводил имя файла и результат grep.

ТС хочет видеть имя файла, за которым будет следовать grep информации по этому файлу. Лишние имена будут печататься, это да.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

ТС хочет видеть имя файла, за которым будет следовать grep информации по этому файлу.

Если поиск не по regex, а текст, то в последнем echo можно вписать не только имя :)

Но можно и для regex:

find . -iname '*.so' -exec sh -c 'nm -g "{}" | grep --label="{}" -H REGEX' \;
vodz ★★★★★
()
Ответ на: комментарий от vodz

Если поиск не по regex, а текст, то в последнем echo можно вписать не только имя :)

Это понятно, но тогда дублирование будет. Хотя если для скрипта, то там можно скрыть это. Для однострочника не очень.

grep --label

Вот это хороший вариант.

xaizek ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.