උප බහලුම් ඇතුළු පෙළ සොයා ගැනීමට “grep” විධානය භාවිතා කරන්නේ කෙසේද


407

නිශ්චිත පෙළක් අඩංගු සියලුම ලිපිගොනු සොයා ගැනීමට මට අවශ්‍යය. මෙම grepවිධානය ක්රියාත්මක වන නමුත් මම (මම මගේ වර්තමාන බහලුම සඳහා එය කරන්න පුළුවන්) සෑම බහලුම සඳහා එය භාවිතා කිරීමට කෙසේ දැයි මා දන්නේ නැහැ. මම කියවීමට උත්සාහ කළ man grepනමුත් එයින් කිසිදු උපකාරයක් නොලැබුණි.


grep -RIn <yor pattern> * සියලුම පෙළ ලිපිගොනු වල වත්මන් නාමාවලි වලින් පහළට සොයනු ඇත. * .C වැනි ගොනු රටා තුළ මගේ සෙවීම පුනරාවර්තව කරන්නේ කෙසේදැයි විශ්වාස නැත

1
--include="*.C"විකල්පයක් සහිත වයිල්ඩ්කාඩ් , @ user311346, @Lekensteyn ට ස්තූතියි.
බොබ් ස්ටයින්

වත්මන් සහ සියලුම උප නාමාවලිවල ඇති නූලක් සඳහා නැවත නැවත ගොනු සෙවීම සඳහා find and grep සංයෝජනය භාවිතා කරන්න. මෙම පරීක්ෂා wilddiary.com/find-files-containing-my-text
Drona

Answers:


542

එය භාවිතා කිරීම වඩා හොඳ වනු ඇත

grep -rl "string" /path

කොහෙද

  • -r(හෝ --recursive) විකල්පය ද සියලු උප බහලුම් තරණය කිරීම සඳහා භාවිතා වේ /pathබැවින්ද,
  • -l(හෝ --files-with-matches) විකල්පය භාවිතා කරනුයේ ගැලපෙන ලිපිගොනු වල ගොනු නාම පමණක් මුද්‍රණය කිරීමට මිස ගැලපෙන රේඛාවලට නොවේ (මෙය වේගය වැඩි දියුණු කළ හැකිය, grepමෙම විකල්පය සමඟ පළමු තරඟයේදී ගොනුවක් කියවීම නවත්වනු ඇත).

13
ඇත්ත වශයෙන්ම "නූල්" සොයා ගැනීම සඳහා පෙළ රටාවක් නම්, එම ක්‍රියාකාරීත්වය භාවිතා කිරීම වඩා හොඳය, එසේ නොමැතිනම් යමෙකුට නූල්වල තිත් හෝ විශේෂ අක්ෂර අඩංගු වන විට ගැටළු වලට මුහුණ දිය හැකිය. , පවතින ආකාරයට. එවිට මම "ස්ථාවර නූල්" සඳහා -rlFස්විච භාවිතා කරමි -F(සහ regexp නොවේ - උදාහරණයක් ලෙස). ඇත්ත වශයෙන්ම, කර්තව්‍යය රීජෙක්ස් භාවිතා කරන්නේ නම්, මට සමාවෙන්න. -R නොමැතිව එකම න්‍යාය, මම බොහෝ විට දකින්නේ මිනිසුන් grep සෙවීම් "පෙළ" ලෙස උපකල්පනය කරන අතර එය විශේෂිත කාරණා රීජෙක්ස් ලෙස අදහස් කරන ගැටළු ඇති කළ හැකි බවයි.
LGB

4
-iනඩුව නොසලකා හරින ධජය ද ඇත .
මාකෝ සෙපී

3
මම --recursiveවිකල්පය පෙන්වීමට පමණක් කැමැත්තෙමි , කෙනෙකුට කතා කළ හැකි විකල්ප සහ භාවිත අවස්ථා ගණනාවක් තිබේ. මම @dmityugov පිළිගත් පිළිතුරෙන් ආරම්භ කළ අතර එය නොමැතිව වැඩ කිරීමට වෙනස් කළෙමි find.
enzotib

1
@NN: done :-)
enzotib

3
C ස්කොට්බිග්ස්: විකල්පය සමඟ--include '*.h'
enzotib

179

ඔබ ලිපිගොනු වලට ගැලපෙන රේඛා සොයන්නේ නම්, මගේ ප්‍රියතම විධානය වන්නේ:

grep -Hrn 'search term' path/to/files
  • -H ගොනු නාමය මුද්‍රණය කිරීමට හේතු වේ (බහු ගොනු සෙවූ විට ගම්‍ය වේ)
  • -r පුනරාවර්තන සෙවීමක් කරයි
  • -n රේඛා අංකය මුද්‍රණය කිරීමට හේතු වේ

path/to/files.වත්මන් නාමාවලියෙහි සෙවීම විය හැකිය

මට වඩාත් ප්‍රයෝජනවත් වන තවත් විකල්ප:

  • -Iද්විමය ගොනු නොසලකා හරින්න (අනුපූරකය: -aසියලුම ලිපිගොනු පෙළ ලෙස සලකන්න)
  • -Fsearch termසාමාන්‍ය ප්‍රකාශනයක් ලෙස නොව වචනානුසාරයෙන් සලකන්න
  • -i සිද්ධි සංවේදී නොවන සෙවීමක් කරන්න
  • --color=alwaysපයිප්ප හරහා යන විට පවා වර්ණ බල කිරීමට less. lessආධාරක වර්ණ සෑදීම සඳහා, ඔබ -rවිකල්පය භාවිතා කළ යුතුය :

    grep -Hrn search . | less -r
    
  • --exclude-dir=dirවැනි .svnසහ නාමාවලි බැහැර කිරීම සඳහා ප්‍රයෝජනවත් වේ .git.

නිදර්ශන ප්‍රතිදානය


13
-Hෆෝල්ඩරයක අතිරික්ත වේ, තවත් එක් ගොනුවක් තිබේ නම්, අනුමාන කළ හැකිය. ඇත්ත වශයෙන්ම, man පිටුව පවසයි-H, --with-filename: Print the file name for each match. This is the default when there is more than one file to search.
enzotib

මම එය දැන සිටියේ නැත, එය සෑම විටම මා බලාපොරොත්තු වූ පරිදි ක්‍රියාත්මක විය. ලිපිගොනු සොයන විට එය මගේ පෙරනිමි විධානයයි.
ලෙකන්ස්ටයින්

1
A, කියන්න, .a දිගුවක් (සහ මෙය -r සමඟ ඒකාබද්ධ කිරීම) සමඟ පමණක් ගොනු සලකා බැලීමට ක්‍රමයක් තිබේද?
user2413

6
24 user2413 උත්සාහ කරන්න--include '*.*'
Lekensteyn

1
@alper trygrep --exclude='*~' ...
Lekensteyn

25

ඔබට මේ වගේ දෙයක් භාවිතා කළ හැකි යැයි මම විශ්වාස කරමි:

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

අදහස් වලින් පැහැදිලි කිරීම

findදී ඇති මාර්ගයක උප බහලුම්වල ඇති ගොනු සහ නාමාවලි සහ සබැඳි වැනි වෙනත් වස්තු සොයා ගැනීමට ඔබට ඉඩ දෙන විධානයකි. ගොනු නාමයන් සපුරාලිය යුතු ආවරණයක් ඔබ සඳහන් නොකරන්නේ නම්, එය සියලු නාමාවලි වස්තු ගණනය කරයි.

  • -type f එය සැකසිය යුත්තේ ගොනු පමණක් මිස නාමාවලි නොවේ.
  • -exec grepසොයාගත් සෑම ගොනුවක් සඳහාම, එය grep විධානය ක්‍රියාත්මක කළ යුතු අතර, එහි ගොනු නාමය එයට තර්කයක් ලෙස සම්මත කර ගොනු නාමය වෙනුවට ආදේශ {}කළ යුතුය.

3
නොදන්නා අය සඳහා, එකතු කිරීම -name '*.py''.py' වලින් අවසන් වන ගොනු වලට ගැලපීම් සීමා කරයි.
ඩැනියෙල් එෆ්

මම කැමතියි මෙය ඔවුන්ගේ grep විධානය තුළ -R ක්‍රියාත්මක නොකරන සේවාදායකයින් ආවරණය කරයි.
Aviose

ඔබට ගැලපෙන රේඛාව සහ ගොනු නාමය මුද්‍රණය කිරීමට අවශ්‍ය නම්, ක්‍රියාත්මක කරන්න:... -exec bash -c 'grep -r "mystring" {} && echo {}' \;
ඩොන් ලී

කෙලින්ම grep භාවිතා කිරීමට සාපේක්ෂ පරිපූර්ණත්වය කුමක්ද?
ජොනතන්

On ඩොන් ලී සිතන්නේ වඩා හොඳ යැයි -exec bash -c 'grep -H "pattern" $1' _ {} \;
සිතමු

21

මගේ පෙරනිමි විධානය

grep -Rin string *

මම 'R' කැපිටල් lsභාවිතා කරන්නේ එය පුනරාවර්තන සඳහා භාවිතා කරන බැවිනි . Grep දෙකම පිළිගන්නා බැවින්, එය භාවිතා නොකිරීමට හේතුවක් නැත.

සංස්කරණය කරන්න: එච්.වී.එන්.එස්වීටින් අනුව, පෙනෙන ආකාරයට සිම්ලින්ක් -Rඅනුගමනය -rකරනු ඇත.


1
සැඟවුණු ලිපිගොනු වලද සෙවීමට, ධාවනය කරන්න shopt -s dotglob( -s"set" ලෙස මතක තබා ගන්න). ලිපිගොනු ඉවත් කිරීමේදී ප්‍රවේශම් වන්න. ඔබ dotglob සක්‍රීය කර ඇත්නම් rm -r *, වත්මන් dir හි ඇති සියල්ල ඉවත් කරයි, නමුත් ඊට ඉහළින් ඇති නාමාවලිය ..ගැලපෙන නිසා . ඩොට්ග්ලොබ් අක්‍රීය කිරීමට, භාවිතා කරන්න shopt -u dotglob(" සැකසූ "). වෙනස්කම් තාවකාලික වුවත් එය අදාළ වන්නේ වත්මන් කවචයට පමණි.
ලෙකන්ස්ටයින්

මට මේ ගැන අමතක වුනා. එක පේළියකට එය සැකසීමට ක්‍රමයක් තිබේද? shopt -s dotglob & <grep cmd> & shopt -y dotglobවඩා පහසු දෙයක් වැනි දෙයක් ? මේ ආකාරයෙන් එය නැවත
සැකසීම

එසේම, grep -Rin string .මෙම බොහෝ අවස්ථාවන්හිදී භාවිතා කිරීම පහසුය . මම භාවිතා කරන්නේ * එය වඩාත් ස්වාභාවිකව පැමිණෙන බැවිනි.
user606723

1
ඔබ පුනරාවර්තන ග්‍රෙප් කරන්නේ නම්, ඔබට "සිට" ආරම්භ කළ හැකිය. වෙනුවට "*". ඩොට්ග්ලොබ් අවශ්‍ය නොවේ.
මයිකල් Šrajer

1
මේ සඳහා ඡන්දය දෙන්න, මෑන්පේජ් හි සඳහන් නොවන එක් දෙයක් Rසංකේතාත්මක සබැඳි අනුගමනය කරනු ඇත, rඑසේ නොවේ
එච්වීඑන්එස්වීටිං

12

ඔබ අලුත් දෙයක් උත්සාහ කිරීමට කැමති නම්, ackපහරක් දෙන්න . වත්මන් නාමාවලිය නැවත නැවත සෙවීමේ විධානය string:

ack string

ස්ථාපනය තරමක් සරල ය:

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

(ඔබට දැනටමත් නාමාවලිය ලැබී ඇති ~/binඅතර එය වඩාත් සුදුසු වන්නේ ඔබේ ය PATH.)


2
නැතහොත් apt-get install ack-grep (, සහ ඔබේ .bashrc වෙත අන්වර්ථය ack = ack-grep එක් කරන්න)
markijbema

chmodවිධානයෙහි අවසාන පරාමිතීන් කරන්නේ කුමක්ද? ඔවුන් සඳහා විශේෂ වේ chmodහෝ ඔවුන් (අදාළ බෑෂ් ඇත !#:3කොටස)?
එලියට් ඩාර්ෆින්ක්

බෑෂ් ගේ පාවිච්චි කරනවා ඒ @ElliottDarfink ඉතිහාසය ලක්ෂණය - !යනු අවස්ථාවට designator . පුනරාවර්තනයන් වළක්වා ගැනීමට ඒවා ඉතා බලවත් ය. !#:3මේ දක්වා විධාන රේඛාවේ තුන්වන ටෝකනය සඳහන් කරයි, එනම් ~/bin/ackමේ අවස්ථාවේ දී.
කොන්රාඩ් රුඩොල්ෆ්

4

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 භාවිතා කරන්නේ කෙසේද


rgrep සපයනු ලබන්නේ උබුන්ටු හි පෙරනිමියෙන් ස්ථාපනය කර ඇති grep පැකේජය මගිනි.
කරල්

2

යාවත්කාලීන 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"

(සටහන: zenzotib විසින් පහත දැක්වෙන අදහස් දැක්වීමේදී යෝජනා කර ඇති පරිදි, මෙය ඔවුන්ගේ නම්වල ඇති අවකාශයන් ඇතුළු ගොනු / නාමාවලි සමඟ ක්‍රියා නොකරයි.)


මුල් තනතුර

සෙවුම් නූල සමඟ එම පේළිය සහ ප්‍රතිදානය සෙවීම සඳහා:

$ 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;

අවකාශයන් අඩංගු ගොනු නාමයන් අසමත් වේ. අසමත් වීම සැඟවී ඇත්තේ stderr නොපෙන්වයි.
enzotib

zenzotib එය පෙන්වා දීම ගැන ස්තූතියි .. එය නිශ්චිතව දක්වා ඇති ශ්‍රිතය සඳහා තවමත් විසඳී නොමැත .. මම තවත් එක් ලයිනර් එකක් එකතු කර ඇත්තෙමි ..
හරියටම

දැන් පිළිතුර ඇඩ්මිටුගොව්ගේ පිළිතුරට සමානය.
enzotib

ඔව්, නමුත් ඒ අර්ථයෙන් ගත් කල, මෙම පිටුවෙහි ඇති බොහෝ පිළිතුරු ඔවුන් භාවිතා කරන ආකාරය සම්බන්ධයෙන් සමාන වේ නම් grep, ඊට යාබදව උප කුලකය භාවිතා findවේ grep... නමුත් ඔබ වෙනස් පිළිතුරක් ලෙස විවිධ ස්විච සහ tweaks පිළිගන්නේ නම්, සමහර විට මගේත් මෙතනට ගැළපේවි .. නැත්නම් ඔබ වෙනස්ද? අවසාන යාවත්කාලීනය මගේ සෙවුමේදී මා කැමති දේ කරයි: සෙවුම් යතුර සහ පේළි අංක සහිත රේඛා සහිත ගොනු නම්. වඩා :) සහ වඩා හොඳ කියවීම සඳහා වර්ණ ප්‍රතිදානය සහ දෝෂ පෙරණය ..
හරියටම

2

grep( GNU හෝ BSD )

පරාමිතිය grepසමඟ වත්මන් ෆෝල්ඩරය නැවත නැවත සෙවීමට ඔබට මෙවලම භාවිතා කළ හැකිය -r, වැනි:

grep -r "pattern" .

සටහන: -r- පුනරාවර්තනව උප බහලුම් සොයන්න.

විශේෂිත ලිපිගොනු තුළ සෙවීම සඳහා, ඔබට ග්ලෝබින් සින්ටැක්ස් භාවිතා කළ හැකිය :

grep "class foo" **/*.c

සටහන: ග්ලෝබිං විකල්පය ( **) භාවිතා කිරීමෙන් , එය සියළුම ලිපිගොනු නිශ්චිත දිගුවකින් හෝ රටාවකින් පුනරාවර්තනය කරයි. මෙම වාක්‍ය ඛණ්ඩය සක්‍රීය කිරීමට, ධාවනය කරන්න : shopt -s globstar. ඔබට **/*.*සියලු ලිපිගොනු (සැඟවුණු හා දිගුවකින් තොරව) හෝ වෙනත් රටාවක් සඳහාද භාවිතා කළ හැකිය .

ඔබේ තර්කය දිග වැඩියි යන දෝෂය ඔබ සතුව ඇත්නම්, ඔබගේ සෙවුම අඩු කිරීම ගැන සලකා බලන්න, හෝ findඒ වෙනුවට සින්ටැක්ස් භාවිතා කරන්න :

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

විකල්පයක් ලෙස භාවිතා කරන්න ripgrep.

ripgrep

ඔබ විශාල ව්‍යාපෘති හෝ විශාල ලිපිගොනු වල වැඩ කරන්නේ නම්, ripgrepඒ වෙනුවට ඔබ භාවිතා කළ යුත්තේ :

rg "pattern" .

GitHub ව්‍යාපෘති පිටුවේ ලේඛන, ස්ථාපන පියවර හෝ ප්‍රභව කේතය පරීක්ෂා කරන්න .

එය කඩිනම් වැනි වෙනත් ඕනෑම මෙවලමක් වඩා දෙයක් GNU / BSD grep , ucg, ag, sift, ack, ptඑහි මුදුනේ ඉදි බැවින් හෝ ඒ හා සමාන රස්ට් ගේ regex එන්ජිම ඉතා වේගවත් සොයමින් කිරීමට පරිමිත automata, SIMD හා දැඩි ප්රායෝගික ප්රතිස්තිකරණය යොදා ගන්නා.

.gitignoreලිපිගොනු වල දක්වා ඇති රටා නොසලකා හැරීමට එය සහාය දක්වයි , එබැවින් එකවර විවිධ ගෝලීය රටාවන්ට එරෙහිව තනි ගොනු මාර්ගයක් ගැලපේ.


ඔබට පොදු පරාමිතීන් භාවිතා කළ හැකිය:

  • -i - සංවේදී සෙවීම.
  • -I - ද්විමය ගොනු නොසලකා හරින්න.
  • -w - සම්පූර්ණ වචන සඳහා සොයන්න (අර්ධ වචන ගැලපීමට ප්‍රතිවිරුද්ධව).
  • -n - ඔබේ තරඟයේ රේඛාව පෙන්වන්න.
  • -C/ --context(උදා -C5) - සන්දර්භය වැඩි කරයි, එවිට ඔබට අවට කේතය පෙනේ.
  • --color=auto - ගැලපෙන පෙළ සලකුණු කරන්න.
  • -H - පෙළ සොයාගත් තැන ගොනු නාමය පෙන්වයි.
  • -c- ගැලපෙන රේඛා ගණන පෙන්වයි. සමඟ ඒකාබද්ධ කළ හැකිය -H.

1

මම මෙය කරන්නේ ඉතා අවතක්සේරු කළ විධානයක් වන xargs භාවිතා කරමිනි

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

find ./ මඟින් ඔබට වත්මන් ෆෝල්ඩරයක ඇති සියලුම ලිපිගොනු වල පුනරාවර්තන ලැයිස්තුවක් ලබා දෙයි, ඉන්පසු ඔබ එය එක් එක් ලිපිගොනු වල grep විධානය ක්‍රියාත්මක කරන xargs වෙත නල කරන්න.


4
භාවිතා xargsනොකර -print0විකල්පය කිරීමට findහා -0විකල්පය කිරීමට xargsවිරුද්ධත්වය, එය හිස් තැන් අඩංගු ගොනු නාමය මත අසාර්ථක වනු ඇත.
enzotib

zenzotib ඔබ යෝජනා කළ පරිදි මම පිළිතුර සංස්කරණය කර ඇත්තෙමි.- කරුණාකර සමාලෝචනය කරන්න, සංස්කරණය කිරීමට හා නිවැරදි කිරීමට අවශ්‍ය නම්, ඔබ විසින් නැවත සංස්කරණය කිරීම සතුටට කරුණකි. ඔබට ස්තුතියි
αғsнιη

1
As කාසියා: දැන් කමක් නැහැ, මගේ පහත්කම ඉවත් කළා.
enzotib

0

මෙහි පිළිතුරු ඕනෑ තරම් ඇති බව මම දනිමි, නමුත් ලිපිගොනු සෙවීමේදී වෙනත් සීමාවන් එක් කිරීමට ඔබ කැමති නම් මෙන්න විකල්පයක්:

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

මෙය ක්‍රියාත්මක වන්නේ grepප්‍රති result ලයක් හමු වුවහොත් 0 නැවත ලබා දෙන බැවිනි . උදාහරණයක් ලෙස ඔබට 1 MB විශාල සහ යමක් අඩංගු ගොනු සොයාගත හැකිය :

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

බහු අවශ්‍යතා සඳහා ඔබට බොහෝ විට -OGNU grep හි ඇති ප්‍රශස්ත ධජය භාවිතා කිරීමට අවශ්‍ය වනු ඇත .


0

සී, සීපීපී කේතයෙන් සෙවීමට ස්ක්‍රිප්ට් එකක් (කේතය සොයා ගැනීම):

#!/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"

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.