我有以下代码行:
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