Есть ли способ требовать только одно эхо в этом сценарии? - PullRequest
0 голосов
/ 13 марта 2020

У меня есть следующая строка кода:

for h in "${Hosts[@]}" ; do echo "$MyLog" | grep -m 1 -B 3 -A 1 $h >> /LogOutput ; done

Моя переменная hosts - это большой массив хостов

Есть ли лучший способ сделать это, не требуя от меня эхо на каждом л oop? Как вместо grep для переменной?

Ответы [ 4 ]

0 голосов
/ 13 марта 2020

Предполагая, что вы находитесь в системе GNU. в противном случае info grep

С grep --help

grep --help | head -n1

Вывод

Usage: grep [OPTION]... PATTERN [FILE]...

Итак, в соответствии с этим вы можете сделать.

for h in "${Hosts[@]}" ; do grep -m 1 -B 3 -A 1 "$h" "$MyLog" >> /LogOutput ; done
0 голосов
/ 13 марта 2020

Один echo, без циклов, и все операции обработки выполняются параллельно, с GNU Parallel :

echo "$MyLog"  | parallel -k --tee --pipe 'grep -m 1 -B 3 -A 1 {}' ::: "${hosts[@]}"

-k поддерживает вывод в порядке. --tee и --pipe обеспечивают дублирование stdin для всех процессов. Параллельные процессы заключены в одинарные кавычки.

0 голосов
/ 13 марта 2020

распечатать вашу строку в несколько строк, которые вы можете затем grep? Что-то вроде:

printf '%s\n' "${Hosts[@]}" | grep  -m 1 -B 3 -A 1 $h >> /LogOutput
0 голосов
/ 13 марта 2020

Нет echo, нет л oop

#!/bin/bash
hosts=(host1 host2 host3)
MyLog="
asf host
sdflkj
sadkjf
sdlkjds
lkasf
sfal
asf host2
sdflkj
sadkjf
"
re="${hosts[@]}"
egrep -m 1 -B 3 -A 1 ${re// /|} <<< "$MyLog"

Вариант с одним echo

echo "$MyLog" | egrep -m 1 -B 3 -A 1 ${re// /|}

Использование

$ ./test
sdlkjds
lkasf
sfal
asf host2
sdflkj
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...