Изо всех сил пытается объединить два утверждения Greps - PullRequest
0 голосов
/ 17 февраля 2011

Привет!

Мне было поручено создать отчет о файлах, которые мы получаем от наших поставщиков оборудования. Мне нужно выполнить поиск этих файлов для двух полей «Test_Version» и «Model-Manufacturer»; для каждого поля мне нужно захватить их соответствующие значения.

При выполнении каждого оператора отдельно я получаю нужные результаты:

1) для 'Test_Version' это было просто:

find . -name "*.VER" -exec grep 'Test_Version=' '{}' ';' -print; 

./(FILE_NAME).VER
Test_Version=2.6.3
./(FILE_NAME).VER
Test_Version=2.4.7

2) для «Модель-Производитель», это было немного сложно, так как мне нужно несколько строк. Я решил эту проблему, используя параметр Perl Regex -P.

find . -name "*.VER" -exec grep -P 'Model-Manufacturer:.\n.' '{}' ';' -print

./(FILE_NAME).VER
--> Model-Manufacturer:
D12-100
./(FILE_NAME).VER
--> Model-Manufacturer:
H21-100

В идеале я хотел бы создать простой отчет, который выглядит следующим образом

(FILE_NAME)
Test_Version=2.6.3
Model-Manufacturer:    D12-100
(FILE_NAME)
Test_Version=2.4.7
Model-Manufacturer:    H21-100

Моя попытка объединить оба greps не работает, т.е. ничего не найдено:

find . -name "*.VER" -exec grep -P 'Test_Version=.Model-Manufacturer:.\n.' '{}' ';' -print

Как я могу выполнить поиск по обоим полям и получить желаемый результат?

Ответы [ 3 ]

1 голос
/ 17 февраля 2011

Я создал тестовый файл:

$ cat test1.VER
Test_Version=2.6.3
Model-Manufacturer:
D12-100
Test_Version=2.4.7
Model-Manufacturer:
H21-100
Test_Version=2.6.3
Model-Manufacturer:
D12-100
Test_Version=2.4.7
Model-Manufacturer:
H21-100

Я создал копию для репликации поиска по нескольким файлам:

$ cp test1.VER test2.VER

Наконец, я могу создать отчет, который вы 'Вы ищете следующую строку команд:

$ find . -name "*.VER" -print -exec egrep -A 1 'Test_Version=|Model-Manufacturer:' {} ';' | sed -e '/Model/N; s/\n/ /'
./test1.VER
Test_Version=2.6.3
Model-Manufacturer: D12-100
Test_Version=2.4.7
Model-Manufacturer: H21-100
Test_Version=2.6.3
Model-Manufacturer: D12-100
Test_Version=2.4.7
Model-Manufacturer: H21-100
./test2.VER
Test_Version=2.6.3
Model-Manufacturer: D12-100
Test_Version=2.4.7
Model-Manufacturer: H21-100
Test_Version=2.6.3
Model-Manufacturer: D12-100
Test_Version=2.4.7
Model-Manufacturer: H21-100

egrep позволяет использовать расширенные регулярные выражения, в которых я использую | в качестве оператора чередования.

The -A указывает на (e)grep, заставляет предоставлять строку контекста после каждого совпадения.Если ваши входные файлы содержат нежелательный контент после строк Test_Version, вам может потребоваться включить команду grep -v, переданную между find и sed, чтобы удалить нежелательный вывод.

1 голос
/ 18 февраля 2011
find . -name "*.VER" -exec \
    awk '/Model-Manufacturer:/ {a = $0; pnr = NR; getline; 
             if (NR != pnr) a = a FS $0; 
             flag = 1} 
         /Test_Version=/ {a = $0; flag = 1} 
         {if (flag)
             {if (FILENAME != prevf) {
                 printf "%s\n", FILENAME; 
                 prevf = FILENAME}; 
              print a;}
          flag = 0}' {} \;
0 голосов
/ 17 февраля 2011

Я бы использовал что-то вроде

cat {} | grep Exp1 | grep Exp1

Проблема в том, как скрыть / внедрить трубопровод в команду. В качестве быстрого решения вы можете переместить две команды greps в сценарии оболочки и выполнить их с помощью команды find. Но не самое красивое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...