如何zgrep多个字符串

时间:2016-09-29 09:14:30

标签: linux bash shell unix scripting

我正在尝试使用下面的代码对多个字符串进行zgrep,但是如果我省略了其中一个参数,则会调整大量未匹配的文件。但是,我输入它正常工作的所有5个字符串。我怎么能zgrep任意数量的字符串,即使它只是5的5。

echo "Enter string 1: "
read isdn1
echo "Enter string 2: "
read isdn2
echo "Enter string 3: "
read isdn3
echo "Enter string 4: "
read isdn4
echo "Enter string 5: "
read isdn5

for host in $(cat host.txt); do ssh "$host" "cd /onip/cdr/output/snapshot/normal/backup && zgrep '$isdn1\|$isdn2\|$isdn3\|$isdn4\|$isdn5' xyz_shot*"

2 个答案:

答案 0 :(得分:0)

由于省略了某些值,因此表达式变为

e1|e2||e4|e5

中间的空表达式使一切都匹配。

请注意,这是最优化的方法,但我会首先使用sed删除双管道字符:

e=`echo $isdn1|$isdn2|$isdn3|$isdn4|$isdn5 |  sed 's/|\+/|/g'`

然后

for host in $(cat host.txt); do ssh "$host" "cd /onip/cdr/output/snapshot/normal/backup && zgrep \"$e\" xyz_shot*"

(请注意,管道字符的转出消失了,但这里没有必要)

答案 1 :(得分:0)

试试这个:

echo "Enter string 1: "
read isdn1
echo "Enter string 2: "
read isdn2
echo "Enter string 3: "
read isdn3
echo "Enter string 4: "
read isdn4
echo "Enter string 5: "
read isdn5

grep_str=`echo "$isdn1|$isdn2|$isdn3|$isdn4|$isdn5"|perl -pe 's/\|\||\|$//'`
for host in $(cat host.txt); do ssh "$host" "cd /onip/cdr/output/snapshot/normal/backup && zgrep '$grep_str' xyz_shot*"