grep
සියලුම නාමාවලි සහ උප බහලුම් පුනරාවර්තනය කරන්නේ කෙසේද ?
find . | xargs grep "texthere" *
grep -rin xlsx *.pl
Redhat Linux හි මා වෙනුවෙන් වැඩ නොකරයි. මට "ගැලපීමක් නැත" දෝෂයක් ඇත.
grep
සියලුම නාමාවලි සහ උප බහලුම් පුනරාවර්තනය කරන්නේ කෙසේද ?
find . | xargs grep "texthere" *
grep -rin xlsx *.pl
Redhat Linux හි මා වෙනුවෙන් වැඩ නොකරයි. මට "ගැලපීමක් නැත" දෝෂයක් ඇත.
Answers:
grep -r "texthere" .
පළමු පරාමිතිය සෙවීම සඳහා නිත්ය ප්රකාශනය නියෝජනය කරන අතර දෙවැන්න සෙවිය යුතු නාමාවලිය නියෝජනය කරයි. මෙම අවස්ථාවේ දී, .
වර්තමාන නාමාවලිය අදහස් වේ.
සටහන: මෙය GNU grep සඳහා ක්රියා කරන අතර සොලාරිස් වැනි සමහර වේදිකා වලදී ඔබ විශේෂයෙන් උරුමය ක්රියාත්මක කිරීමට වඩා GNU grep භාවිතා කළ යුතුය. සොලාරිස් සඳහා මෙය විධානයයි ggrep
.
AIX 5.3
උදාහරණයක් ලෙස එන grep මත එය ක්රියා නොකරයි .
ඔබ කැමති ගොනුවේ දිගුව හෝ රටාව ඔබ දන්නේ නම්, තවත් ක්රමයක් වන්නේ --include
විකල්පය භාවිතා කිරීමයි :
grep -r --include "*.txt" texthere .
බැහැර කළ යුතු ලිපිගොනු ද ඔබට සඳහන් කළ හැකිය --exclude
.
ඔබ නිතරම කේතය හරහා සොයන්නේ නම්, ඇග් (රිදී සෙවුම්කරු) යනු ග්රෙප් සඳහා වඩා වේගවත් විකල්පයකි, එය කේත සෙවීම සඳහා රිසිකරණය කර ඇත. නිදසුනක් ලෙස, එය පෙරනිමියෙන් පුනරාවර්තනය වන අතර ලැයිස්තුගත කර ඇති ලිපිගොනු සහ නාමාවලි ස්වයංක්රීයව නොසලකා හරිනු ඇත .gitignore
, එබැවින් ඔබට ග්රහණය කර ගැනීමට හෝ සොයා ගැනීමට එකම කරදරකාරී බැහැර විකල්පයන් පසුකර යාමට අවශ්ය නැත.
=
උබුන්ටු මත හොඳින් ක්රියා කරයි. PS: එය පසුගාමී අවකාශයක් විය යුතුයි, නමුත් SO ලකුණු කිරීමේ විග්රහකය අසමත් විය.
grep
, ඔබ දන්නා නිසා :)
--include "*.txt" --include "*.TXT"
තවද:
find ./ -type f -print0 | xargs -0 grep "foo"
නමුත් grep -r
වඩා හොඳ පිළිතුරකි.
find . -type f -exec grep "foo" '{}' \;
සහය දක්වන තැන හොඳින් ක්රියා කරයි.
find ./ -type f -print0 | xargs -0 grep "foo"
මම දැන් සෑම විටම භාවිතා කරමි (වින්ඩෝස් හි GoW - Gnu සමඟ වින්ඩෝස් වල පවා ):
grep --include="*.xxx" -nRHI "my Text to grep" *
එයට පහත විකල්ප ඇතුළත් වේ:
--include=PATTERN
නාමාවලි වල පුනරාවර්තනය ගොනු ගැලපීම සෙවීම පමණි
PATTERN
.
-n, --line-number
එක් එක් නිමැවුම් පේළිය එහි ආදාන ගොනුව තුළ ඇති රේඛා අංකය සමඟ උපසර්ගය කරන්න.
(සටහන: phuclv එකතු අදහස් බව -n
එසේ කාර්ය සාධන ගොඩක් අඩු , එසේ ඔබ එම විකල්පය මඟ කිරීමට ඔබට අවශ්ය විය හැකිය)
-R, -r, --recursive
එක් එක් නාමාවලිය යටතේ ඇති සියලුම ලිපිගොනු පුනරාවර්තනයෙන් කියවන්න; මෙය
-d recurse
විකල්පයට සමාන වේ .
-H, --with-filename
සෑම තරඟයක් සඳහාම ගොනු නාමය මුද්රණය කරන්න.
-I
ද්විමය ගොනුවක් ගැලපෙන දත්ත අඩංගු නොවන ආකාරයට සකසන්න;
මෙය--binary-files=without-match
විකල්පයට සමාන වේ .
මට සිද්ධි සංවේදී නොවන ප්රති .ල අවශ්ය නම් මට ' i
' ( -nRHIi
) එකතු කළ හැකිය .
මට ගන්න පුළුවන්:
/home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" *
src/GitList/Application.php:43: 'git.hidden' => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(),
src/GitList/Provider/GitServiceProvider.php:21: $options['hidden'] = $app['git.hidden'];
tests/InterfaceTest.php:32: $options['hidden'] = array(self::$tmpdir . '/hiddenrepo');
vendor/klaussilveira/gitter/lib/Gitter/Client.php:20: protected $hidden;
vendor/klaussilveira/gitter/lib/Gitter/Client.php:170: * Get hidden repository list
vendor/klaussilveira/gitter/lib/Gitter/Client.php:176: return $this->hidden;
...
-R
.
*
හෝ ග්ලෝබ් .
රටාවකි (කවචය මගින් අර්ථ නිරූපණය කෙරේ): unix.stackexchange.com/a/64695/7490 . ' .
' විසින් තිත් ගොනු හෝ තිත් ෆෝල්ඩරද තෝරා ගනු ඇත (වැනි .git/
)
grep -rnI
නමුත් පසුව මම ඉගෙන ගත්තා -n
කාර්ය සාධනය බොහෝ සෙයින් අඩු වන නිසා මම එය ඇත්ත වශයෙන්ම අවශ්ය විටදී භාවිතා කරන අතර සාමාන්යයෙන් මම භාවිතා කරමි-rI
POSIX පද්ධති වලදී, ඔබට -r
පරාමිතිය සොයාගත නොහැකි grep
අතර ඔබ grep -rn "stuff" .
ක්රියාත්මක නොවනු ඇත, නමුත් ඔබ find
විධානය භාවිතා කරන්නේ නම්:
find . -type f -exec grep -n "stuff" {} \; -print
එකඟ විය Solaris
සහ HP-UX
.
-exec
විකල්පය - සංකේතය {}
විසින් දැනට සොයා ගත් ගොනු නාමය කිරීමට සඳහනක් find
මෙවලමක් (අපි සොයා ගොනු නාමය යමක් බව), ද -exec
විකල්පය සමඟ අවසන් කළ යුතුයි ;
සංකේතය (මෙම exec විධාන අවසන් නිමිත්තෙන්), නමුත් මේ සියල්ල නිසා ෂෙල් එකක ධාවනය වන සංකේතය ගැලවී යා යුතුය .. අවසාන වශයෙන් -print
විකල්පය මඟින් find
සොයාගත් ගොනු නාමයන් තිරයේ මුද්රණය කිරීමට ඉඩ දෙයි .
**
grep -r
කෘති භාවිතා කිරීම, නමුත් එය විශාල ෆෝල්ඩර වල අධික ලෙස මරණයට පත් විය හැකිය.
වඩාත් ප්රායෝගික භාවිතය සඳහා, ග්ලෝබින් සින්ටැක්ස් ( **
) භාවිතා කරන සින්ටැක්ස් මෙන්න :
grep "texthere" **/*.txt
රටා තෝරාගත් රටාව සහිත විශේෂිත ලිපිගොනු පමණක් ග්රහණය කරයි. එය Bash +4 හෝ zsh වැනි ආධාරක කවච සඳහා ක්රියා කරයි .
මෙම අංගය සක්රිය කිරීමට, ධාවනය කරන්න : shopt -s globstar
.
මෙයද බලන්න: ලිනක්ස් හි විශේෂිත පෙළ අඩංගු සියලුම ලිපිගොනු සොයා ගන්නේ කෙසේද?
git grep
Git අනුවාද පාලනය යටතේ ඇති ව්යාපෘති සඳහා, භාවිතා කරන්න:
git grep "pattern"
එය වඩා ඉක්මන් වේ.
ripgrep
විශාල ව්යාපෘති සඳහා, ඉක්මන්ම අඹරන මෙවලම වේ ripgrep
පෙරනිමියෙන් ලිපිගොනු පුනරාවර්තනය කිරීමයි:
rg "pattern" .
සෙවීම ඉතා වේගවත් කිරීම සඳහා සීමිත ස්වයංක්රීය, සිම්ඩ් සහ ආක්රමණශීලී වචනාර්ථමය ප්රශස්තිකරණ භාවිතා කරන රස්ට්ගේ රීජෙක්ස් එන්ජිමට ඉහළින් එය ඉදිකර ඇත . පරීක්ෂා කරන්න මෙතන සවිස්තර විශ්ලේෂනයක් .
නම සොයා ගැනීමට files
සමග path
ඇත්තෙන් වෙනසට භාජනය වූ සුවිශේෂ අඩංගු string
විධාන පහත භාවිතය UNIX
:
find . | xargs grep "searched-string"
සඳහා Linux
:
grep -r "searched-string" .
UNIX
සේවාදායකයේ ගොනුවක් සොයා ගන්න
find . -type f -name file_name
LINUX සේවාදායකයේ ගොනුවක් සොයා ගන්න
find . -name file_name
ඔබට අවශ්ය වන්නේ සංකේතාත්මක සබැඳි නොව සත්ය නාමාවලි පමණක් අනුගමනය කිරීමට නම්,
grep -r "thingToBeFound" directory
ඔබට සංකේතාත්මක සබැඳි මෙන්ම සත්ය නාමාවලි අනුගමනය කිරීමට අවශ්ය නම් (අනන්ත පුනරාවර්තනයෙන් ප්රවේශම් වන්න),
grep -R "thing to be found" directory
ඔබ පුනරාවර්තනය වීමට උත්සාහ කරන බැවින්, පහත දැක්වෙන විකල්පයන් ද ඔබට ප්රයෝජනවත් විය හැකිය:
-H: outputs the filename with the line
-n: outputs the line number in the file
එබැවින් වත්මන් නාමාවලියෙහි හෝ ඕනෑම උප බහලුමක ඩාර්ත් වඩර් අඩංගු සියලුම ලිපිගොනු සොයාගෙන ගොනු නාමය සහ රේඛා අංකය ග්රහණය කර ගැනීමට ඔබට අවශ්ය නම්, නමුත් පුනරාවර්තනය සංකේතාත්මක සබැඳි අනුගමනය කිරීමට අවශ්ය නොවන්නේ නම්, විධානය වනුයේ
grep -rnH "Darth Vader" .
ඔබට නාමාවලියෙහි බළලා යන වචනයේ සියලුම සඳහන සොයා ගැනීමට අවශ්ය නම්
/home/adam/Desktop/TomAndJerry
ඔබ දැනට නාමාවලියෙහි සිටී
/home/adam/Desktop/WorldDominationPlot
ඔබට අවශ්ය වන්නේ ගොනු නාමය අල්ලා ගැනීමට මිස "බළලුන්" නූලෙහි ඕනෑම අවස්ථාවක රේඛා අංකය නොව, පුනරාවර්තනය සංකේතාත්මක සබැඳි සොයා ගන්නේ නම් ඒවා අනුගමනය කිරීමට ඔබට අවශ්ය නම්, ඔබට පහත සඳහන් ඒවායින් එකක් හෝ ධාවනය කළ හැකිය
grep -RH "cats" ../TomAndJerry #relative directory
grep -RH "cats" /home/adam/Desktop/TomAndJerry #absolute directory
මූලාශ්රය:
"grep --help" ධාවනය
සංකේතාත්මක සබැඳි පිළිබඳ කෙටි හැඳින්වීමක්, මෙම පිළිතුර කියවන සහ ඒවා පිළිබඳ මගේ සඳහනෙන් ව්යාකූල වන ඕනෑම කෙනෙකුට: https://www.nixtutor.com/freebsd/understanding-symbolic-links/
ag දැන් මෙය කිරීමට මගේ ප්රියතම ක්රමය github.com/ggreer/the_silver_searcher . එය මූලික වශයෙන් අක්ක් හා සමාන වන නමුත් තවත් ප්රශස්තිකරණ කිහිපයක් සමඟ.
මෙන්න කෙටි මිණුම් ලකුණක්. සෑම පරීක්ෂණයකටම පෙර මම හැඹිලිය ඉවත් කරමි (cf /ubuntu/155768/how-do-i-clean-or-disable-the-memory-cache )
ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time grep -r "hey ya" .
real 0m9.458s
user 0m0.368s
sys 0m3.788s
ryan@3G08:$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ack-grep "hey ya" .
real 0m6.296s
user 0m0.716s
sys 0m1.056s
ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ag "hey ya" .
real 0m5.641s
user 0m0.356s
sys 0m3.444s
ryan@3G08$ time ag "hey ya" . #test without first clearing cache
real 0m0.154s
user 0m0.224s
sys 0m0.172s
මෙය ක්රියාත්මක විය යුතුය:
grep -R "texthere" *
ඔබ ඩිරෙක්ටරි ව්යුහයකින් සියලුම ලිපිගොනු වල නිශ්චිත අන්තර්ගතයක් සොයන්නේ නම්, ඔබ කරන්නේ find
කුමක්ද යන්න වඩාත් පැහැදිලි බැවින් ඔබට භාවිතා කළ හැකිය :
find -type f -exec grep -l "texthere" {} +
-l
(L හි පහළ කොටස) පෙළ අඩංගු ගොනුවේ නම පෙන්වන බව සලකන්න . ඔබට ඒ වෙනුවට තරගය මුද්රණය කිරීමට අවශ්ය නම් එය ඉවත් කරන්න. නැතහොත් -H
තරගය සමඟ ගොනුව ලබා ගැනීමට භාවිතා කරන්න. සියල්ල එකට ගත් විට, වෙනත් විකල්ප:
find -type f -exec grep -Hn "texthere" {} +
කොහෙද -n
රේඛාව අංකය මුද්රණය කරයි.
find
පිළිබඳ වැලැක්විමට අනවශ්ය භාවිතය දෙකටම විසඳුම xargs
හා භාවිතය +
වෙනුවට \;
සමග -exec
එමගින් අනවශ්ය ක්රියාවලිය දියත් ටොන් වැළකී. :-)
මගේ වර්තමාන යන්ත්රයේ මගේ නඩුව සඳහා වැඩ කළේ මෙයයි (වින්ඩෝස් 7 හි git bash):
find ./ -type f -iname "*.cs" -print0 | xargs -0 grep "content pattern"
අවකාශයන් සහිත මාර්ග සඳහා -print0 සහ -0 මට සැමවිටම අමතක වේ.
සංස්කරණය කරන්න: මගේ ප්රියතම මෙවලම දැන් ripgrep: https://github.com/BurntSushi/ripgrep/releases . එය සැබවින්ම වේගවත් වන අතර වඩා හොඳ පෙරනිමි ඇත (පෙරනිමියෙන් පුනරාවර්තනය වැනි). මගේ මුල් පිළිතුරට සමාන උදාහරණයක් නමුත් ripgrep භාවිතා කිරීම:rg -g "*.cs" "content pattern"
grep -r "texthere" .
(දැනුම් දීමේ කාලය අවසානයේ)
(^ ණය: https://stackoverflow.com/a/1987928/1438029 )
පැහැදිලි කිරීම:
grep -r "texthere" /
( සියලු නාමාවලි සහ උප බහලුම් පුනරාවර්තනය කරන්න )
grep -r "texthere" .
( මෙම නාමාවලි සහ උප බහලුම් පුනරාවර්තනය කරන්න )
grep [options] PATTERN [FILE...]
[විකල්ප]
-R, -r, --recursive
එක් එක් නාමාවලිය යටතේ ඇති සියලුම ලිපිගොනු පුනරාවර්තනයෙන් කියවන්න.
මෙය
-d recurse
හෝ--directories=recurse
විකල්පයට සමාන වේ .
$ grep --help
$ grep --help |grep recursive
-r, --recursive like --directories=recurse
-R, --dereference-recursive
ack
( http://beyondgrep.com/ )
2018 දී, ඔබට භාවිතා කිරීමට අවශ්ය ripgrep
හෝ the-silver-searcher
ඒවා විකල්පයන්ට වඩා වේගවත් නිසා.
පළමු මට්ටමේ උප බහලුම් 336 ක් සහිත නාමාවලිය මෙන්න:
% find . -maxdepth 1 -type d | wc -l
336
% time rg -w aggs -g '*.py'
...
rg -w aggs -g '*.py' 1.24s user 2.23s system 283% cpu 1.222 total
% time ag -w aggs -G '.*py$'
...
ag -w aggs -G '.*py$' 2.71s user 1.55s system 116% cpu 3.651 total
% time find ./ -type f -name '*.py' | xargs grep -w aggs
...
find ./ -type f -name '*.py' 1.34s user 5.68s system 32% cpu 21.329 total
xargs grep -w aggs 6.65s user 0.49s system 32% cpu 22.164 total
OSX හි, මෙය ස්ථාපනය කරයි ripgrep
: brew install ripgrep
. මෙය ස්ථාපනය කරයි silver-searcher
: brew install the_silver_searcher
.
rg
මුල සිටම පුනරාවර්තන grep විධානයක් එකට එකතු කිරීම සම්බන්ධයෙන් සැලකිය යුතු සීමාවක් ඇත. භාවිතා කිරීම rg
: rg foo
. යුනික්ස් මෙවලම් භාවිතා කිරීම : find . | xargs grep foo
. ඔබගේ ඕනෑම ගොනුවක එහි උපුටා දැක්වීමක් තිබේ නම්, ඔබ භාවිතා කළ find . -print0 | xargs -0 grep foo
යුතුය. ඔබ මෙය වසරකට කිහිප වතාවක් භාවිතා කරන්නේ නම් ඔබට මතකද?
find . -type f -exec grep 'regex' {} +
මෙම මෙවලම් කිසියම් විධිමත්භාවයකින් භාවිතා කරන්නේ නම් මතක තබා ගැනීම පහසුය. ඔබට නිතර දේවල් සොයා ගැනීමට අවශ්ය නම් ඔබ කෙසේ ctags
හෝ ධාවනය කළ යුතුය etags
.
මගේ IBM AIX සේවාදායකයේ (OS අනුවාදය: AIX 5.2), භාවිතා කරන්න:
find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \;
මෙය ගොනුවේ මාර්ගය / ගොනු නම සහ සාපේක්ෂ රේඛා අංකය මුද්රණය කරයි:
./inc/xxxx_x.h
2865: / ** විස්තරය: stringYouWannaFind * /
කෙසේ වෙතත්, එය මට වැඩ කරයි :)
පහත දැක්වෙන්නේ String
පුනරාවර්තන ලෙස Unix
හා Linux
පරිසරය සෙවීමේ විධානයයි .
සඳහා UNIX
වන විධානය:
find . -name "string to be searched" -exec grep "text" "{}" \;
සඳහා Linux
වන විධානය:
grep -r "string to be searched" .
පවතින ධජ ලැයිස්තුවක් සඳහා:
grep --help
අනුරූප රේඛා අංකය සමඟ වත්මන් නාමාවලියෙහි රීජෙක්ස් පෙළ සඳහා සියලු ගැලපීම් ලබා දෙයි :
grep -rn "texthere" .
මූල ඩිරෙක්ටරියේ සිට අනුරූප රේඛා අංකය සහ නොසලකා හැරීමේ නඩුව සමඟ පෙළ සඳහා සියලු ගැලපීම් ලබා දෙයි :
grep -rni "texthere" /
මෙහි භාවිතා කරන ධජ:
-r
පුනරාවර්තන -n
ප්රතිදානය සමඟ රේඛා අංකය මුද්රණය කරන්න -i
නඩුව නොසලකා හරින්නමම හිතන්නේ ඔබ ලිවීමට උත්සාහ කරන්නේ මෙයයි
grep myText $(find .)
ඔබට grep පහරක් ඇති ගොනු සොයා ගැනීමට අවශ්ය නම් මෙය වෙනත් ප්රයෝජනවත් දෙයක් විය හැකිය
grep myText $(find .) | cut -d : -f 1 | sort | uniq
එය සටහන් කර ගන්න find . -type f | xargs grep whatever
සොයාගැනීම් හා ගැලපෙන ලිපිගොනු විශාල ප්රමාණයක් ඇති විට, විවිධාකාර විසඳුම් "තර්ක ලැයිස්තුවට දිගු" දෝෂ වලට වැටෙන .
හොඳම ඔට්ටුව grep -r
නමුත් එය ලබා ගත නොහැකි නම් ඒ find . -type f -exec grep -H whatever {} \;
වෙනුවට භාවිතා කරන්න.
xargs
විශේෂයෙන් "තර්ක ලැයිස්තුව දිගු" ගැටළුව සඳහා වන විසඳුමකි.
find . -type f | xargs -L 100 grep whatever
xargs
ප්රමිතිකරණය කර ඇත. " xargs
විධාන රේඛාව ආයාචනය කරන විට, ඒකාබද්ධ තර්කය සහ පරිසර ලැයිස්තු ... {ARG_MAX} -2048 බයිට් නොඉක්මවන පරිදි උපයෝගීතාව විධාන රේඛාවේ දිග සීමා කරයි."
විනෝදය සඳහා, rist ක්රිස්ටැන්ග්රන්ට් පිළිතුර ටයිප් කිරීමට නොහැකි නම් * .txt ලිපිගොනු ඉක්මන් හා අපිරිසිදු සෙවීමක් :-)
grep -r texthere .|grep .txt
දී ඇති ෆෝල්ඩරයක ($ 1) සියළුම උප ෆෝල්ඩර හරහා ගමන් කරන පුනරාවර්තන (බාෂ් සහ ෂා සමඟ සැහැල්ලුවෙන් පරීක්ෂා කර ඇත) සහ grep
ලබා දී ඇති ලිපිගොනු ($ 2) සඳහා ලබා දී ඇති නූල් ($ 3) සඳහා සෙවීම් භාවිතා කරයි :
$ cat script.sh
#!/bin/sh
cd "$1"
loop () {
for i in *
do
if [ -d "$i" ]
then
# echo entering "$i"
cd "$i"
loop "$1" "$2"
fi
done
if [ -f "$1" ]
then
grep -l "$2" "$PWD/$1"
fi
cd ..
}
loop "$2" "$3"
එය ක්රියාත්මක කිරීම සහ නිදර්ශන ප්රතිදානය:
$ sh script start_folder filename search_string
/home/james/start_folder/dir2/filename