在这种情况下,有没有一种方法只需要一个回声



我有以下代码行:

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

我的主机变量是一个大型主机阵列

有没有一种更好的方法可以做到这一点,而不需要我在每个循环中都进行回声?而是像变量上的grep?

echo,无环路

#!/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

一个echo,没有循环,所有的grepping都是并行完成的,带有GNU并行

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

-k使输出保持有序。--tee--pipe确保stdin被复制到所有进程。并行运行的进程用单引号括起来。

将字符串打印到多行,然后可以进行grep?类似于:

printf '%sn' "${Hosts[@]}" | grep  -m 1 -B 3 -A 1 $h >> /LogOutput

假设您使用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

最新更新