පයිප්ප අක්ෂරයක් සහිත රටා සහිත බහු රටා සඳහා මා ග්‍රහණය කරගන්නේ කෙසේද?


688

රටා දෙකෙන් එකකට ගැලපෙන ලිපිගොනු කිහිපයක සියලුම රේඛා සොයා ගැනීමට මට අවශ්‍යය. ටයිප් කිරීමෙන් මා සොයන රටා සොයා ගැනීමට මම උත්සාහ කළෙමි

grep (foo|bar) *.txt

නමුත් කවචය |පයිප්පයක් ලෙස අර්ථ නිරූපණය කරන barඅතර ක්‍රියාත්මක කළ නොහැකි විට පැමිණිලි කරයි.

එකම ලිපිගොනු සමූහයක විවිධ රටාවන් සඳහා මා ග්‍රහණය කරගන්නේ කෙසේද?



2
grep 'word1 \ | word2 \ | word3' / path / to / file
lambodar

Answers:


939

පළමුව, ඔබ කවචය මඟින් රටාව පුළුල් කිරීමෙන් ආරක්ෂා කළ යුතුය. එය කිරීමට ඇති පහසුම ක්‍රමය නම් ඒ වටා තනි උපුටා දැක්වීම් කිරීමයි. තනි උපුටා දැක්වීම් ඔවුන් අතර ඕනෑම දෙයක් ව්‍යාප්ත වීම වළක්වයි (බැක්ස්ලෑෂ් ද ඇතුළුව); එවිට ඔබට කළ නොහැකි එකම දෙය රටාවේ තනි උපුටා දැක්වීම් පමණි.

grep -- 'foo*' *.txt

(ද කරුණාවෙන් --සමහර නතර කිරීමට අවසන්-of-විකල්පය-මාකර් grepGNU ඇතුළු නිර්මාණයන් grepගොනුවක් ප්රතිකාර සිට -foo-.txt(සිට ෂෙල් විසින් පුළුල් කරන බව උදාහරණයක් *.txt) විකල්පයක් ලෙස ගත යුතු (එය විකල්පය නොවන තර්කය පහත වුවත් මෙහි)).

ඔබට තනි උපුටා දැක්වීමක් අවශ්‍ය නම්, ඔබට එය ලිවිය හැකිය '\''(අවසන් වචන වචනාර්ථය, වචනාර්ථය උපුටා දැක්වීම, විවෘත වචන වචනාර්ථයෙන්).

grep -- 'foo*'\''bar' *.txt

දෙවනුව, grep අවම වශයෙන් රටා සඳහා සින්ටැක්ස් දෙකක් වත් සහාය දෙයි. පැරණි, පෙරනිමි සින්ටැක්ස් ( මූලික නිත්‍ය ප්‍රකාශන ) විකල්ප ( |) ක්‍රියාකරුට සහය නොදක්වයි , සමහර අනුවාදවල එය දිගුවක් ලෙස තිබුණද බැක්ස්ලෑෂ් එකකින් ලියා ඇත.

grep -- 'foo\|bar' *.txt

අතේ ගෙන යා හැකි ක්‍රමය නම් නවතම සින්ටැක්ස්, දීර් extended නිත්‍ය ප්‍රකාශන භාවිතා කිරීමයි. එය තේරීමට ඔබට -Eවිකල්පය සමත් විය යුතුය grep(කලින් එය egrepවෙනම විධානයකින් සිදු කරන ලදි )

grep -E -- 'foo|bar' *.txt

ඔබ කිසියම් රටා කිහිපයක් සොයන විට ඇති විය හැකි තවත් හැකියාවක් (වි jun ටනය භාවිතා කරමින් සංකීර්ණ රටාවක් තැනීමට වඩා වෙනස්ව) බහු රටා සම්මත කිරීමයි grep. -eවිකල්පය සමඟ එක් එක් රටාවට පෙර ඔබට මෙය කළ හැකිය.

grep -e foo -e bar -- *.txt

හෝ පේළි කිහිපයකට රටා දමන්න:

grep -- 'foo
bar' *.txt

නැතහොත් එම රටා ගොනුවක එක් පේළියකට එක් කර ධාවනය කරන්න

grep -f that-file -- *.txt

*.txtඑක් ගොනුවකට විස්තාරණය වුවහොත්, එක් ගොනුවකට grepවඩා ඇති විට ඇති ආකාරයට ගැලපෙන රේඛා එහි නම සමඟ උපසර්ග නොකරනු ඇති බව සලකන්න . ඒ සඳහා වැඩ grepකිරීම සඳහා, GNU වැනි සමහර ක්‍රියාත්මක කිරීම් සමඟ grep, ඔබට -Hවිකල්පය භාවිතා කළ හැකිය, නැතහොත් ඕනෑම ක්‍රියාත්මක කිරීමක් සමඟ, ඔබට /dev/nullඅතිරේක තර්කයක් ලෙස සමත් විය හැකිය .


¹ සමහර grepනිර්මාණයන් සමග වඩාත් perl බසට අනුකූල අය මෙන් සහාය -P, හෝ වර්ධනය කිරීමද සමග අය -X, -Kksh ආදේශක සඳහා ...

² අතර egrepPOSIX විසින් අතහැර දමා ඇති අතර සමහර විට තවදුරටත් සමහරක් පද්ධති හමු වී ඇත, මෙම POSIX හෝ GNU උපයෝගිතා ස්ථාපනය කර නොමැති විට, සොලාරිස් වැනි වෙනත් පද්ධති මත, පසුව egrepඔබගේ එකම විකල්පය එහි පරිදි වේ /bin/grepපිළිබඳ ආධාරක කිසිවක් -e, -f, -E, \|හෝ බහු රේඛා රටා


19
පැත්තක සටහනක් ලෙස - රටා සවි කර ඇති විට, ඔබ සැබවින්ම පුරුද්දට පිවිසිය යුතුය, fgrepනැතහොත් grep -Fකුඩා රටාවන් සඳහා වෙනස නොසැලකිලිමත් වනු ඇත, නමුත් ඒවා වැඩි වන විට, ප්‍රතිලාභ පෙන්වීමට පටන් ගනී ...
TC1

8
Page TC1
fgrep

20
1 TC1 grep -Fතථ්‍ය කාර්යසාධන ප්‍රතිලාභයක් තිබේද යන්න රඳා පවතින්නේ grep ක්‍රියාත්මක කිරීම මත ය: ඒවායින් සමහරක් කෙසේ හෝ එකම ඇල්ගොරිතම භාවිතා කරයි, -Fඑමඟින් වෙනසක් සිදු වන්නේ රටාව විග්‍රහ කිරීමට වැය කරන කාලය හා සෙවීමේ වේලාවට පමණක් නොවේ. -Fනිදසුනක් ලෙස GNU grep වේගවත් නොවේ ( grep -Fබහු දෝෂ සහිත ස්ථානවල එය මන්දගාමී වන දෝෂයක් ද ඇත - එකම නියත රටාව grepසැබවින්ම සැලකිය යුතු වේගයකින් යුක්ත වේ!). අනෙක් අතට, BusyBox grep -Fවිශාල ලිපිගොනු වලින් බොහෝ ප්‍රයෝජන ලබයි.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

4
සාමාන්‍ය ප්‍රකාශනයේ කොටසක් සඳහා පමණක් ප්‍රත්‍යාවර්ත විය යුතු වඩාත් සංකීර්ණ රටාවන් සඳහා එය "\ (" සහ "\)" සමඟ කාණ්ඩගත කළ හැකි බව සඳහන් කළ යුතුය (පැන යාම යනු පෙරනිමි "මූලික නිත්‍ය ප්‍රකාශන" සඳහා ය. ) (?).
පීටර් මෝර්ටෙන්සන්

4
egrepපුරෝකථනය කරන සටහන grep -E. එය GNU විශේෂිත නොවේ (එයට නිසැකවම ලිනක්ස් සමඟ කිසිදු සම්බන්ධයක් නැත). ඇත්ත වශයෙන්ම, සුපුරුදු පරිදි grepතවමත් සහාය නොදක්වන සොලාරිස් වැනි පද්ධති ඔබ තවමත් සොයා ගනු -Eඇත.
ස්ටෙෆාන් චසෙලාස්

109
egrep "foo|bar" *.txt

හෝ

grep "foo\|bar" *.txt
grep -E "foo|bar" *.txt

gnu-grep හි man පිටුව තෝරාගෙන:

   -E, --extended-regexp
          Interpret PATTERN as an extended regular expression (ERE, see below).  (-E is specified by POSIX.)

Matching Control
   -e PATTERN, --regexp=PATTERN
          Use PATTERN as the pattern.  This can be used to specify multiple search patterns, or to protect  a  pattern
          beginning with a hyphen (-).  (-e is specified by POSIX.)

(...)

   grep understands two different versions of regular expression syntax: basic and extended.”  In  GNU grep,  there
   is  no  difference  in  available  functionality  using  either  syntax.   In  other implementations, basic regular
   expressions are less powerful.  The following description applies to extended regular expressions; differences  for
   basic regular expressions are summarized afterwards.

ආරම්භයේ දී මම වැඩිදුර කියවා නැති නිසා සියුම් වෙනස්කම් මම හඳුනා නොගත්තෙමි.

Basic vs Extended Regular Expressions
   In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead  use  the
   backslashed versions \?, \+, \{, \|, \(, and \).

මම සෑම විටම egrep සහ අනවශ්‍ය ලෙස paren භාවිතා කළෙමි, මන්ද මම උදාහරණ වලින් ඉගෙන ගත්තෙමි. දැන් මම අලුත් දෙයක් ඉගෙන ගත්තා. :)


මට එය පහත පරිදි භාවිතා කළ හැකි නම්: egrep "[f]oo|[b]ar" *.txtමෙම පිළිතුර නිසා stackoverflow.com/a/9375940/2402577 @user නොදන්නා
ඇල්පර්

1
@alper: ඒක මට තේරුමක් නැහැ. ඔබගේ සම්බන්ධිත ප්‍රශ්නයේදී, ps- ලැයිස්තුවේ විධානය දර්ශනය වීම නැවැත්වීම හැක් කිරීමකි, නමුත් ඔබ ටෙක්ස්ට් ගොනුවක අඹරමින් සිටී. මෙම වරහන් සමඟ, ඔබට විකල්ප සඳහා ග්‍රහණය විය හැක, නමුත් සමහරක් ඉදිරිපත් නොකරන්න. egrep "[nm]oon|[jt]ar" *.txtසඳ, දහවල්, භාජනය හෝ තාර සොයා ගනීවි. සම්බන්ධිත නිදසුනක් සඳහා, වෙනත් අයෙකු විසින් යෝජනා කළ පරිදි මම pgrep භාවිතා කරමි, නැතහොත් විධානයේ නම විධානය නම් ps -C විධානය භාවිතා කරමි. මෙම විශේෂිත අවස්ථාවෙහිදී, විවිධ ස්ථානවල "පර්යන්තය" සඳහා අඹරන විට, මෙම කඩුල්ල ඉතා දක්ෂයි. විකල්ප සඳහා, භාවිතා කරන්න:echo "erminal" | egrep "[tT]?erminal"
පරිශීලක නොදන්නා

25

TC1 පැවසූ පරිදි, -Fභාවිතා කළ හැකි විකල්පයක් ලෙස පෙනේ:

$> cat text
some text
foo
another text
bar
end of file

$> patterns="foo
bar" 

$> grep -F "${patterns}" text
foo
bar

1
@poige fo 'foo \ nbar' විකල්පය ගැන මා දැන සිටියේ නැත, මෙහි ව්‍යාප්තිය ක්‍රියාත්මක වන්නේ කෙසේදැයි විශ්වාස නැත, සොයා බැලිය යුතුය, නමුත් ස්තූතියි, එය ඇත්තෙන්ම ප්‍රයෝජනවත් වේ.
haridsv

හොඳයි! මෙම විකල්පය එය වඩා වේගයෙන් ධාවනය වන බව පෙනේ (එය රීජෙක්ස් අක්‍රීය කරන බැවින්).
qwertzguy

17

පළමුව, ඔබ විශේෂ අක්ෂර සඳහා මිල ගණන් භාවිතා කළ යුතුය. දෙවනුව, එසේ වුවද, grepවිකල්පය කෙලින්ම තේරුම් නොගනී; ඔබට භාවිතා කිරීමට අවශ්‍ය වනු ඇත egrep, හෝ (GNU සමඟ grepපමණක්) grep -E.

egrep 'foo|bar' *.txt

(ප්‍රත්‍යාවර්තකය විශාල රීජෙක්ස් එකක කොටසක් නොවේ නම් වරහන් වර්‍ග අනවශ්‍යය.)


6
ඇත්ත වශයෙන්ම, grep -Eවඩා සම්මත වේ egrep.
jw013

8

ඔබට සාමාන්‍ය ප්‍රකාශන අවශ්‍ය නොවේ නම්, එය භාවිතා කිරීම වඩා වේගවත් fgrepහෝ grep -Fබහු-ඊ පරාමිතීන් සමඟ, මේ වගේ:

fgrep -efoo -ebar *.txt

fgrep(විකල්පයක් ලෙස grep -F) සාමාන්‍ය ග්‍රෙප් වලට වඩා වේගවත් වේ, මන්ද එය සාමාන්‍ය ප්‍රකාශන වෙනුවට ස්ථාවර නූල් සොයයි.


5
fgrepඅවලංගු කර ඇති බව සඳහන් කරමින් කරුණාකර මෙම පිටුවේ ඇති අදහස් ද බලන්න .
phk

6

ප්‍රති result ලය ලබා ගැනීම සඳහා ඔබට පහත විධානය උත්සාහ කළ හැකිය:

egrep 'rose.*lotus|lotus.*rose' some_file

4

පයිප්ප ( |) යනු විශේෂ කවච අක්ෂරයකි, එබැවින් එය ගැලවී යා යුතුය ( \|) හෝ අත්පොත ( man bash) අනුව උපුටා දැක්විය යුතුය :

උපුටා ගැනීම භාවිතා කරනුයේ කවචයට ඇතැම් අක්ෂර හෝ වචනවල විශේෂ අරුත ඉවත් කිරීමට ය . විශේෂ අක්ෂර සඳහා විශේෂ ප්‍රතිකාර අක්‍රීය කිරීමට, වෙන් කර ඇති වචන හඳුනා ගැනීම වැළැක්වීමට සහ පරාමිති ප්‍රසාරණය වැළැක්වීමට එය භාවිතා කළ හැකිය.

අක්ෂර ද්විත්ව උපුටා දැක්වීම් ඇතුළත් කිරීමෙන් උපුටා දැක්වීම් තුළ ඇති සියලුම අක්ෂරවල වචනාර්ථමය වටිනාකම ආරක්ෂා වේ

උපුටා නොගත් බැක්ස්ලෑෂ් ( \) යනු ගැලවීමේ චරිතයයි.

බලන්න: බාෂ් හි පැන යා යුතු චරිත මොනවාද?

මෙන්න උදාහරණ කිහිපයක් (තවමත් සඳහන් කර නැති මෙවලම් භාවිතා කිරීම):

  • භාවිතා කිරීම ripgrep:

    • rg "foo|bar" *.txt
    • rg -e foo -e bar *.txt
  • භාවිතා කිරීම git grep:

    • git grep --no-index -e foo --or -e bar

      සටහන: එය --and, --orසහ වැනි බූලියන් ප්‍රකාශන සඳහා ද සහාය --notවේ.

එක් පේළියකට සහ ක්‍රියාකාරිත්වය සඳහා, බලන්න: බහු හා රටා සමඟ grep ධාවනය කරන්නේ කෙසේද?

එක් ගොනුවකට සහ ක්‍රියාකාරිත්වය සඳහා, බලන්න: ගොනුවක ඇති සියලුම නූල් හෝ රීජෙක්ස් පරීක්ෂා කරන්නේ කෙසේද?


3

බහුවිධ රටාවන් සඳහා ග්‍රහණය කර ගැනීම සඳහා ලාභදායී හා ප්‍රීතිමත් ක්‍රමයක්:

$ echo "foo" > ewq ; echo "bar" >> ewq ; grep -H -f ewq *.txt ; rm ewq

1
එය පැහැදිලි කිරීමකින් ප්‍රයෝජන ගත හැකිය.
පීටර් මෝර්ටෙන්සන්

2
පැහැදිලි කිරීම නම් grep හි -fවිකල්පය විවිධ රටා සහිත ගොනුවක් ගනී. තාවකාලික ගොනුවක් සෑදීම වෙනුවට (පසුව මකා දැමීමට ඔබට අමතක විය හැකිය), ෂෙල් ක්‍රියාවලි ආදේශනය භාවිතා කරන්න:grep -f <(echo foo; echo bar) *.txt
ජාකොබ්

3

දිනයන් මෝඩ ලෙස හැඩගස්වා ඇති ප්‍රවේශ ල logs ු-සටහන් මා සතුව තිබුණි: [30 / Jun / 2013: 08: 00: 45 +0200]

නමුත් මට එය ප්‍රදර්ශනය කිරීමට අවශ්‍ය වූයේ: 30 / Jun / 2013 08:00:45

ගැටළුව වන්නේ මගේ ග්‍රෙප් ප්‍රකාශයේ “OR” භාවිතා කිරීම, මට තරඟ ප්‍රකාශන දෙක වෙන වෙනම පේළි දෙකකින් ලැබීමයි.

මෙන්න විසඳුම:

grep -in myURL_of_interest  *access.log  | \
grep -Eo '(\b[[:digit:]]{2}/[[:upper:]][[:lower:]]{2}/[[:digit:]]{4}|[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2}\b)'   \
| paste - - -d" " > MyAccess.log

2

ටීඑල්; ඩීආර්: බහුවිධ රටාවන්ගෙන් එකක් ගැලපීමෙන් පසු ඔබට තවත් බොහෝ දේ කිරීමට අවශ්‍ය නම්, ඒවා ඇතුලත් කරන්න \(pattern1\|pattern2\)

උදාහරණය: 'දිනය' යන නම අඩංගු විචල්‍යයක් නූල් හෝ int ලෙස අර්ථ දක්වා ඇති සියලුම ස්ථාන සොයා ගැනීමට මට අවශ්‍යය. (උදා: "int cronDate =" හෝ "String textFormattedDateStamp ="):

cat myfile | grep '\(int\|String\) [a-zA-Z_]*date[a-zA-Z_]* =' 

සමඟ grep -E, ඔබට වරහන් හෝ පයිප්පයෙන් ගැලවීමට අවශ්‍ය නැත, එනම්,grep -E '(int|String) [a-zA-Z_]*date[a-zA-Z_]* ='


1

මෙය මට වැඩ කරයි

root@gateway:/home/sshuser# aws ec2 describe-instances --instance-ids i-2db0459d |grep 'STATE\|TAG'

**STATE**   80      stopped

**STATE**REASON     Client.UserInitiatedShutdown    Client.UserInitiatedShutdown: User initiated shutdown

**TAGS**    Name    Magento-Testing root@gateway:/home/sshuser#

1

මෙය කිරීමට විවිධ ක්‍රම තිබේ.

  1. grep 'foo\|bar' *.txt
  2. egrep 'foo|bar' *.txt
  3. find . -maxdepth 1 -type f -name "*.txt" | xargs grep 'foo\|bar'
  4. find . -maxdepth 1 -type f -name "*.txt" | xargs egrep 'foo|bar'

3 වන සහ 4 වන විකල්පය ලිපිගොනු තුළ පමණක් ග්‍රහණය වන .txtඅතර ඒවායේ නම් ඇති නාමාවලි වලක්වනු ඇත.
එබැවින්, ඔබගේ භාවිතයට අනුව, ඉහත සඳහන් ඕනෑම විකල්පයක් ඔබට භාවිතා කළ හැකිය.
ස්තූතියි !!


1

@ geekosaur ගේ පිළිතුරට එක් කිරීමට , ඔබට ටැබ් සහ අවකාශය අඩංගු බහු රටා තිබේ නම් ඔබ පහත විධානය භාවිතා කරයි

grep -E "foo[[:blank:]]|bar[[:blank:]]"

[[:blank:]]අවකාශයක් හෝ ටැබ් අක්ෂරයක් නියෝජනය කරන RE අක්ෂර පන්තිය කොහිද ?

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.