точное - linux поиск текста в файлах grep




Может ли grep показывать только слова, соответствующие шаблону поиска? (10)

Есть ли способ сделать 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? Или использовать другую комбинацию инструментов?


ripgrep

Вот пример использования ripgrep :

rg -o "(\w+)?th(\w+)?"

Он будет соответствовать всем словам, соответствующим th .


Вы можете направить свой вывод grep в Perl следующим образом:

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

Вы также можете попробовать 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

Для поиска всех слов с началом с «icon-» следующая команда работает идеально. Я использую Ack здесь, который похож на grep, но с лучшими параметрами и хорошим форматированием.

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

Попробуйте 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 , не нужно сочетать инструменты.

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

Это проще, чем вы думаете. Попробуй это:

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.

Я был неудовлетворен сильным синтаксисом 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

$ grep -w

Выдержка из страницы grep man:

-w: выберите только те строки, содержащие совпадения, которые образуют целые слова. Тест состоит в том, что совпадающая подстрока должна либо находиться в начале строки, либо должна предшествовать неклассическому составляющему символу.


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