Поиск в файлах. Поиск с заменой. find, sed, grep.

  Linux

Цели написать подробнее чем в man’e у меня нет. Только то что часто нужно и используется изо дня в день.

В примерах файлы имеют имена file**.txt.

Например file01.txt следующего содержания:

a
fq2
f
wafew
f
word
word
wordwordword
asdfa3rfafword32rqafef

Поиск

Найти все файлы в которых содержиться word:

grep -r «word» ./
./file04.txt:word
./file01.txt:word
./file01.txt:word
./file01.txt:wordwordword
./file01.txt:asdfa3rfafword32rqafef
./file08.txt:wordwordword

./ — указывает директорию в которой ищем.

Поиск без учета регистра:

grep -ri «WOrd» ./
./file04.txt:word
./file01.txt:word
./file01.txt:word
./file01.txt:wordwordword
./file01.txt:asdfa3rfafword32rqafef
./file08.txt:wordwordword
Не выводить строку в которой найдено совпадение:
grep -ril «WOrd» ./
./file04.txt
./file01.txt
./file08.txt

Найти файл с нужным именем:

find . -name file01*
./file01.txt

Найти все файлы с определенным расширением:

find . -name «*.txt»
./file09.txt
./file04.txt
./file05.txt
./file07.txt
./file03.txt
./file06.txt
./file02.txt
./file10.txt
./file01.txt
./file08.txt
Номера строк в которых встречается word:
# cat -n file01.txt | grep word | awk ‘{print $1}’
6
7
8
9

Поиск с заменой

Также легко можно заменять строки с помощью sed.

sed -i -e «s/word/WORDnew/g» file01.txt

Теперь file01.txt выглядет так:

a
fq2
f
wafew
f
WORDnew
WORDnew
WORDnewWORDnewWORDnew
asdfa3rfafWORDnew32rqafef

Если повторить выполнение команды, ничего не измениться, так как sed чувствителен к регистрку. Чтобы это убрать можно использовать ключ i:

sed -i -e «s/word/WORDnew/gi» file01.txt

Теперь file01.txt будет измениться до состояния:

a
fq2
f
wafew
f
WORDnewnew
WORDnewnew
WORDnewnewWORDnewnewWORDnewnew
asdfa3rfafWORDnewnew32rqafef

И наконец поиск и замена во всех файлах содеражихся в этом каталоге и ниже:

find . -type f -exec sed -i -e «s/word/WORDnew/gi» {} \;