2014-10-14 2 views
0

Я ищу способ использовать grep для поиска нескольких строк, но сохраняйте тот же порядок. Так, например, если у меня есть эта команда:Используйте grep для поиска нескольких строк, но сохраните порядок

egrep '(string1|string2|string3)' /some/file.txt 

Я могу вернуться:

string2 
string1 
string3 

В зависимости от того, что они находятся в файле. Что мне нужно, чтобы это независимо от того, где в файле найти строки, они всегда возвращаются:

string1 
string2 
string3 

Или, если не найден нашел, что это ничего не возвращает, но порядок по-прежнему сохраняется:

string1 
string3 
+2

Тогда вам нужно их искать по одному. –

+0

поиск и сортировка? – YaleCheung

ответ

2

Если выход можно заказать (т.е. string1 < < строка2 string3) Вы можете сделать следующее:

egrep '(string1|string2|string3)' /some/file.txt | sort 

Если это не может быть заказал, или искать их с тремя различными Grep:

egrep 'string1' /some/file.txt 
egrep 'string2' /some/file.txt 
egrep 'string3' /some/file.txt 

или использовать массив и для цикла:

stringsToSearch=(string1 string2 string3) 

for item in ${stringsToSearch[*]} 
do 
egrep '$item' /some/file.txt 
done 
+2

Из всех предложений ваша петля была лучшей и работала как шарм. – lostinthewoods

+0

Я рад это слышать, спасибо :) – boh

0

Как автоматизировать делать это по одному за раз:

echo "string1 string2 string3" | xargs -n 1 -J%% /some/file.txt задать расширенное

1

Сканирование один раз, затем печать совпадений для каждого выражения по очереди. Если вход соответствует нескольким выражениям, он указан в первом наборе, который соответствует.

Я использую двоеточие в качестве разделителя выражений; очевидно, не стесняйтесь меняться по своему усмотрению.

awk -v 'expr=string1:string2:string3' ' 
    BEGIN { n=split(expr, e, /:/); 
     for(i=i; i<=n; ++i) m[i]="" } 
    { for(i=1; i<=n; ++i) if ($0 ~ e[i]) { 
     m[i]=m[i] $0 ORS; next } } 
    END { for (i=1; i<=n; ++i) printf m[i] }' file 
Смежные вопросы