grep - regular - linux正則表達式




grep只能顯示匹配搜索模式的文字嗎? (9)

grep命令僅用於匹配和perl

grep -o -P 'th.*? ' filename

有沒有辦法讓grep輸出與搜索表達式匹配的文件的“單詞”?

如果我想在許多文件中找到所有的“th”實例,我可以這樣做:

grep "th" *

但輸出結果會像(大膽的是我);

some-text-file : the cat sat on the mat  
some-other-text-file : the quick brown fox  
yet-another-text-file : i hope this explains it thoroughly 

我想要它輸出的,使用相同的搜索,是:

the
the
the
this
thoroughly

這可能使用grep? 或者使用其他工具組合?


awk ,不需要組合工具。

# awk '{for(i=1;i<=NF;i++){if($i~/^th/){print $i}}}' file
the
the
the
this
thoroughly

你也可以嘗試pcregrep 。 在grep中也有-w選項,但在某些情況下,它不能按預期工作。

Wikipedia

cat fruitlist.txt
apple
apples
pineapple
apple-
apple-fruit
fruit-apple

grep -w apple fruitlist.txt
apple
apple-
apple-fruit
fruit-apple

你可以像這樣將你的grep輸出輸出到Perl中:

grep "th" * | perl -n -e'while(/(\w*th\w*)/g) {print "$1\n"}'

嘗試grep -o

grep -oh "\w*th\w*" *

編輯:從菲爾的評論匹配

文檔

-h, --no-filename
    Suppress the prefixing of file names on output. This is the default
    when there is only  one  file  (or only standard input) to search.
-o, --only-matching
    Print  only  the matched (non-empty) parts of a matching line,
    with each such part on a separate output line.

我對awk難以記住的語法感到不滿,但我喜歡使用一個實用程序來做到這一點。

它看起來像ack(或者ack-grep,如果你使用Ubuntu的話)可以很容易地做到這一點:

# ack-grep -ho "\bth.*?\b" *

the
the
the
this
thoroughly

如果你省略-h標誌,你會得到:

# ack-grep -o "\bth.*?\b" *

some-other-text-file
1:the

some-text-file
1:the
the

yet-another-text-file
1:this
thoroughly

作為獎勵,您可以使用--output標誌為更複雜的搜索執行此操作,並使用我找到的最簡單的語法:

# echo "bug: 1, id: 5, time: 12/27/2010" > test-file
# ack-grep -ho "bug: (\d*), id: (\d*), time: (.*)" --output '$1, $2, $3' test-file

1, 5, 12/27/2010

要用“icon-”開始搜索所有單詞,以下命令完美無缺。 我在這裡使用Ack ,它與grep類似,但有更好的選項和更好的格式。

ack -oh --type=html "\w*icon-\w*" | sort | uniq

這比你想像的更簡單。 嘗試這個:

egrep -wo 'th.[a-z]*' filename.txt #### (Case Sensitive)

egrep -iwo 'th.[a-z]*' filename.txt  ### (Case Insensitive)

哪裡,

 egrep: Grep will work with extended regular expression.
 w    : Matches only word/words instead of substring.
 o    : Display only matched pattern instead of whole line.
 i    : If u want to ignore case sensitivity.

cat *-text-file | grep -Eio "th[a-z]+"