我正在尝试使用下面的代码对多个字符串进行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*"
答案 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*"