نحوه استفاده از دستور "grep" برای یافتن متن از جمله زیرمجموعه ها


به جواب پذیرفته شده بروید




می خواهم تمام پرونده هایی را که شامل یک متن خاص از متن است ، پیدا کنم. grep دستور کار می کند، اما من نمی دانم که چگونه به استفاده از آن برای هر دایرکتوری (من فقط می توانم این کار را برای دایرکتوری فعلی من). من خواندن را امتحان کردم man grep ، اما کمکی نکرد.


383









11 :تعداد پاسخها


بهتر است از آن استفاده کنید

 grep -rl "string" /path
 

جایی که

  • -r (یا --recursive ) از این گزینه برای گذر از همه زیر فهرست ها استفاده می شود /path ، در حالی که
  • -l (یا --files-with-matches ) از گزینه فقط برای چاپ نام پرونده های تطبیق استفاده می شود ، و نه خطوط تطبیق (با توجه به اینکه grep خواندن یک فایل در ابتدا با این گزینه متوقف می شود می تواند سرعت را بهبود بخشد ).

507



اگر به دنبال خطوط مطابق در پرونده ها هستید ، دستور مورد علاقه من:

 grep -Hrn 'search term' path/to/files
 
  • -H باعث می شود نام پرونده چاپ شود (منظور از جستجو در چندین فایل)
  • -r یک جستجوی بازگشتی انجام می دهد
  • -n باعث می شود شماره خط چاپ شود

path/to/files می تواند . در فهرست موجود باشد

گزینه های دیگری که به نظر من بسیار مفید است:

  • -I فایلهای باینری را نادیده بگیرید (مکمل: با -a تمام پرونده ها به عنوان متن رفتار کنید)
  • -F با search term یک کلمه تحت اللفظی رفتار کنید ، نه یک عبارت معمولی
  • -i جستجوی موردی را انجام دهید
  • --color=always برای مجبور کردن رنگ ها حتی در هنگام عبور از لوله less . برای ایجاد less رنگ های پشتیبانی ، باید از -r گزینه زیر استفاده کنید:

     grep -Hrn search . | less -r
     
  • --exclude-dir=dir برای حذف فهرستها مانند .svn و مفید است .git .


خروجی مثال


173



من اعتقاد دارم شما می توانید از چیزی شبیه به این استفاده کنید:

 find /path -type f -exec grep -l "string" {} \;
 

توضیحات درمورد نظرات

find دستوری است که به شما امکان می دهد پرونده ها و اشیاء دیگری مانند دایرکتوری ها و پیوندها را در زیر مجموعه های یک مسیر خاص پیدا کنید. اگر ماسکی را تعیین نکنید که نام پرونده ها باید از آن استفاده کنند ، تمام اشیاء فهرست را فهرست می کند.

  • -type f مشخص می کند که فقط باید پرونده ها را پردازش کند ، نه دایرکتوری ها و غیره.
  • -exec grep مشخص می کند که برای هر پرونده موجود ، باید دستور grep را اجرا کند ، و نام خانوادگی آن را به عنوان آرگومان برای آن ، با جایگزین {} کردن نام پرونده

24



دستور پیش فرض من است

 grep -Rin string *
 

من از "R" capitol استفاده می کنم زیرا ls از آن برای بازگشتی استفاده می کند. از آنجا که grep هر دو را می پذیرد ، هیچ دلیلی برای استفاده از آن نیست.

ویرایش: به ازای هر HVNSweeting ، ظاهراً مسیرهای پیوند -R را دنبال نمی کند که در این صورت -r خواهد بود.


20



اگر می خواهید چیز جدیدی را امتحان کنید ، ack عکس بگیرید. دستور جستجو به صورت بازگشتی در دایرکتوری فعلی برای string :

 ack string
 

نصب بسیار ساده است:

 curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3
 

(مشروط بر اینکه دایرکتوری را قبلاً تهیه کرده باشید ~/bin و ترجیحاً در فهرست شما PATH باشد.)


12



دستور rgrep برای چنین نیاز اختصاص داده شده است

اگر در دسترس نباشد ، می توانید اینگونه را دریافت کنید

 mkdir -p ~/bin
cd ~/bin
wget http://sdjf.esmartdesign.com/files/rgrep
chmod +x rgrep
 

می توانید همانطور که در بالا توضیح داده شد ، مستقیماً گزینه های grep پیش فرض خود را تنظیم کنید.

من از شخصيت استفاده مي كنم

 [[  ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"
args="${args:--Hns} --color=auto"
 

موضوع مرتبط: چگونه همیشه از rgrep با رنگ استفاده کنیم


4



بروزرسانی 2:

این خط از دستورات با استفاده find و grep رفع مشکل:

 $ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +
 

--color=<always or auto> برای خروجی رنگی:

 $ find path_to_search_in -type f \
            -exec grep --color=always -in searchString {} 2>/dev/null +
 

مثال:

 $ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +
 

مثالی که در عکس زیر مشاهده می شود:
snap1


بروزرسانی 1:

می توانید کد زیر را امتحان کنید. به عنوان تابعی در اسکریپت .bashrc یا شما .bash_aliases :

 wherein () 
{ 
    for i in $(find "$1" -type f 2> /dev/null);
    do
        if grep --color=auto -i "$2" "$i" 2> /dev/null; then
            echo -e "\033[0;32mFound in: $i \033[0m\n";
        fi;
    done
}
 

طریقه استفاده: wherein /path/to/search/in/ searchkeyword

مثال:

 $ wherein ~/Documents/ "hello world"
 

(توجه: همانطور که در نظرات زیر توسطenzotib پیشنهاد شده است ، این کار با پرونده / دایرکتوری ها از جمله فضاهایی به نام آنها کار نمی کند.)


پست اصلی

برای جستجوی رشته و خروجی فقط آن خط با رشته جستجو:

 $ for i in $(find /path/of/target/directory -type f); do \
    grep -i "the string to look for" "$i"; done
 

به عنوان مثال:

 $ for i in $(find /usr/share/applications -type f); \
    do grep -i "web browser" "$i"; done
 

برای نمایش نام پرونده حاوی رشته جستجو:

 $ for i in $(find /path/of/target/directory -type f); do \
    if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;
 

به عنوان مثال:

 $ for i in $(find /usr/share/applications -type f); \
    do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
    fi; done;
 

2



grep ( GNU یا BSD )

می توانید از grep ابزار برای جستجوی بازگشتی پوشه فعلی با -r پارامتر ، مانند:

 grep -r "pattern" .
 

توجه: -r - به صورت بازگشتی زیرشاخه ها را جستجو کنید.

برای جستجو در پرونده های خاص ، می توانید از یک ترکیب نحوی مانند:

 grep "class foo" **/*.c
 

توجه: با استفاده از گزینه globbing ( ** ) ، تمام پرونده ها را بطور بازگشتی با الحاق یا الگوی خاص اسکن می کند. برای فعال کردن این نحو ، اجرای shopt -s globstar :. همچنین می توانید **/*.* برای همه پرونده ها (به استثنای پنهان و بدون پسوند) یا هر الگوی دیگری استفاده کنید.

اگر خطایی دارید که استدلال شما خیلی طولانی است ، جستجوی خود را محدود کنید یا find به جای آن از نحو استفاده کنید مانند:

 find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'
 

روش دیگر استفاده کنید ripgrep .

ripgrep

اگر در حال کار روی پروژه های بزرگتر یا پرونده های بزرگ هستید ، باید از ripgrep آن استفاده کنید ، مانند:

 rg "pattern" .
 

اسناد ، مراحل نصب یا کد منبع را در صفحه پروژه GitHub بررسی کنید .

این خیلی سریعتر از هر ابزار دیگر مانند گنو / BSD grep ، ucg ، ag ، sift ، ack ، pt یا مشابه آن، از آن است که در بالا از ساخته شده است موتور عبارت منظم زنگ است که با استفاده از اتوماتای متناهی، SIMD و بهینه سازی تحت اللفظی تهاجمی برای جستجو بسیار سریع است.

این پشتیبانی از نادیده گرفتن الگوهای مشخص شده در .gitignore پرونده ها ، بنابراین یک مسیر واحد پرونده می تواند در برابر الگوهای چندگانه به طور همزمان مطابقت داشته باشد.


می توانید از پارامترهای رایج مانند:

  • -i - جستجوی بی حساس.
  • -I - پرونده های باینری را نادیده بگیرید.
  • -w - کل کلمات را جستجو کنید (در مقابل تطبیق کلمات جزئی).
  • -n - خط مسابقه خود را نشان دهید.
  • -C / --context (به عنوان مثال -C5 ) - زمینه را افزایش می دهد ، بنابراین کد اطراف آن را مشاهده می کنید.
  • --color=auto - متن مطابق را علامت گذاری کنید.
  • -H - نام پرونده را در جایی که متن یافت می شود نشان می دهد.
  • -c - تعداد خطوط تطبیق را نشان می دهد. می توان با ترکیب -H .

2



من این کار را با استفاده از xargs ، یک دستور بسیار کم ارزش انجام می دهم

 find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'
 

find ./ یک لیست بازگشتی از تمام پرونده های موجود در یک پوشه فعلی را به شما می دهد و سپس آن را به xargs می دهید که دستور grep را در هر یک از آن پرونده ها اجرا می کند.


1



من می دانم که پاسخ های زیادی در اینجا وجود دارد ، اگر می خواهید محدودیت های دیگری را هنگام جستجو در پرونده ها اضافه کنید:

 find . -type f -exec grep --quiet string_to_look_for {} ';' -print
 

این کار به این دلیل است که grep اگر نتیجه را پیدا کرد ، 0 در غیر اینصورت. به عنوان مثال می توانید پرونده ها 1 مگابایت بزرگ و حاوی چیزی پیدا کنید:

 find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print
 

برای چندین مورد نیاز احتمالاً می خواهید از پرچم بهینه ساز -O موجود در grep GNU استفاده کنید.


0



اسکریپتی (کد-یافتن) برای جستجوی C ، کد CPP:

 #!/bin/sh

find . \( -iname "*.c" -o -iname "*.cpp" -o -iname "*.h" \) -type f -print0 | xargs -0 grep --color -n "$1"
 

استفاده کنید:

 find-in-code "search string"
 

0


2015-06-11

انتشارات مرتبط


چگونه می توان از Alt + Shift برای تغییر طرح بندی صفحه کلید استفاده کرد؟

چگونه می توان از دستور sudo برای نصب .tar.gz استفاده کرد؟ [تکثیر]

چگونه می توان از grep در تمام پرونده ها به صورت غیر بازگشتی در یک فهرست استفاده کرد؟

نحوه استفاده از grep برای 2 خط مختلف

چگونه دستور sshfs را به ورودی fstab تبدیل کنیم؟

چگونه دستور grep را برای نمایش رشته جستجو نشده نشان دهیم؟ [تکثیر]

چگونه می توان از grep outp به عنوان مسیری برای سی دی استفاده کرد؟

چگونه می توان از پیمایش ماوس برای مخفی کردن ویندوز استفاده کرد؟

نحوه ارسال دستور ترمینال به ترمینال TTY

اوبونتو بودجی: چگونه می توان از Alt + Shift برای تغییر طرح بندی صفحه کلید استفاده کرد؟

[command-line] سوال برچسب


چه تفاوتی بین #! / bin / sh و #! / bin / bash وجود دارد؟

چگونه می توان نرم افزار یا بسته هایی را بدون اینترنت (آفلاین) نصب کرد؟

چرا هنگام ارتقاء از LTS به نسخه بعدی ، "نسخه جدیدی یافت نشد"؟

چگونه می توانم ببینم چه درگاههایی روی دستگاه من باز است؟

نصب pip3 (برای python3) در اوبونتو 16.04 LTS با استفاده از پروکسی

مشکل "انتظار برای پیکربندی شبکه"

از طریق php 7.0 در اوبونتو 16.04 به php 7.1 / 7.2 خاص ارتقا دهید [کپی]

غیرفعال کردن صفحه لمسی در حالی که تایپ کردن کار نمی کند

nux چیست و برای چه مواردی استفاده می شود؟

آیا برنامه ای برای خواندن پرونده های موبی وجود دارد؟