2009-11-20 5 views
1

В каталоге содержится около 20 файлов. Каждый файл имеет строку $str внутри него.скрипт bash для поиска из списка файлов в каталоге

Я хочу написать сценарий, который выбирает эту строку, содержащую строку $str, и выгружать в файл.

Каждый файл должен сбрасывать искомую строку в другой файл.

Например file1 отвалы искали строку в файл под названием found1 и file2 отвалов это файл называется found2 и т.д ....

Может кто-нибудь, пожалуйста, руководство меня об этом?

Мне особенно сложно включить имя файла в команду grep.

Я не могу включить 20 команд grep.

ответ

3

Печать строк с номерами:

grep -n "\$str" filename 

переборе файлов:

for file in *; 
do 
    grep -n "\$str" $file >> "$file".result; 
done 
+0

@Am: хорошо! +1 – RageZ

+0

@Ragez, я тестировал и не получилось, теперь все нормально :) – Amirshk

+1

-1 для использования (ls). -> для файла в * будет делать. – ghostdog74

3
for fname in file*; do 
    grep ${str} ${fname} > ${fname/file/found} 
done 

Магия в ${fname/file/found}. Это принимает значение переменной ${fname}, но заменяет первое появление «файла» на «найденный».

Если вам нужно более сложное преобразование, вы можете запустить имя файла через sed. Допустим, вы хотите заменить все вхождения «файл» с «нашли» вы можете сделать это:

for fname in file*; do 
    outfile=$(echo ${fname} | sed -e 's/file/found/g') 
    grep ${str} ${fname} > ${outfile} 
done 
+0

не нужно использовать sed. с оболочкой, просто сделайте $ {fname // file/found} – ghostdog74

1

использование поглазеть

str="mypattern" 
gawk -v str=$str 'FNR==1{close("found_"d);d++}$0~str{print $0>"found_"d}' file* 

или полностью оболочки

#!/bin/bash 
d=0 
str="mystring" 
for files in file file1 file2 
do 
    d=$((d+1)) 
    f=0 
    while read -r line 
    do 
     case "$line" in 
     *$str*) echo $line >> "found_$d" ; f=1;;  
     esac 
    done < ${files} 
    [ "$f" -eq 0 ] && d=$((d-1)) 
done 
Смежные вопросы