Shell :文件读取 只读取第一行后 莫名退出的问题
2011-10-14 15:30
141 查看
Shell :文件读取 只读取第一行后 莫名退出的问题
这2天有个需求,就是到很多台服务器的日志上去查找某个字符串,所以我就写了个脚本:
#!/bin/bash
testNum=3
declare -a ips
ips[0]=10.22.16.202
ips[1]=10.12.16.203
ips[2]=10.22.16.204
if [ $# != 1 ]; then
echo "please input find file "
else
FINDFILE=$1
fi
while read LINE
echo $ LINE
i=0
while [ $i -lt $testNum ]
do
echo ${ips[$i]}
echo $ LINE
ssh -oPort=20 ${ips[$i]} "cd /data/test/testPath;grep '$ LINE *.txt"
ssh -oPort=20 ${ips[$i]} "cd /data2/test/testPath;grep '$ LINE *.txt"
i=$(($i+1))
done
done < $FINDFILE
由于是要查找很多字符串,所以我就把串放到了一个文件里面,通过读取文件,到各个服务器上去查找,但是每次都是读取第一行就退出了 读取文件的while循环,非常苦恼。尝试把内层while循环去掉,可以正常读取。
把 ssh那2行去掉也可以正常读取。
后来上网找了找,才找到答案,参考了这个帖子:
http://bbs.chinaunix.net/viewthread.php?tid=769040&extra=&page=3
把 脚本改成这样就可以了:
#!/bin/bash
testNum=3
declare -a ips
ips[0]=10.22.16.202
ips[1]=10.12.16.203
ips[2]=10.22.16.204
if [ $# != 1 ]; then
echo "please input find file "
else
FINDFILE=$1
fi
exec 3<FINDFILE
while read LINE <&3
echo $ LINE
i=0
while [ $i -lt $testNum ]
do
echo ${ips[$i]}
echo $ LINE
ssh -oPort=20 ${ips[$i]} "cd /data/test/testPath;grep '$ LINE *.txt"
ssh -oPort=20 ${ips[$i]} "cd /data2/test/testPath;grep '$ LINE *.txt"
i=$(($i+1))
done
done
解释如下:
问题的关键在于:
read从输入读取了一行内容后,
其它的程序(比如 rsh或sed)从同样的地方把其它的输入读走了,
read当然读不到其它内容了,
while也就结束了
改成
exec 3<urfile
while read var <&3
do
....
done
这种模式就可以了。
原来的情况是 FD1 ===>read FD1 ===>sed
后来的情况是 FD3 ===>read FD1 ===>sed
这2天有个需求,就是到很多台服务器的日志上去查找某个字符串,所以我就写了个脚本:
#!/bin/bash
testNum=3
declare -a ips
ips[0]=10.22.16.202
ips[1]=10.12.16.203
ips[2]=10.22.16.204
if [ $# != 1 ]; then
echo "please input find file "
else
FINDFILE=$1
fi
while read LINE
echo $ LINE
i=0
while [ $i -lt $testNum ]
do
echo ${ips[$i]}
echo $ LINE
ssh -oPort=20 ${ips[$i]} "cd /data/test/testPath;grep '$ LINE *.txt"
ssh -oPort=20 ${ips[$i]} "cd /data2/test/testPath;grep '$ LINE *.txt"
i=$(($i+1))
done
done < $FINDFILE
由于是要查找很多字符串,所以我就把串放到了一个文件里面,通过读取文件,到各个服务器上去查找,但是每次都是读取第一行就退出了 读取文件的while循环,非常苦恼。尝试把内层while循环去掉,可以正常读取。
把 ssh那2行去掉也可以正常读取。
后来上网找了找,才找到答案,参考了这个帖子:
http://bbs.chinaunix.net/viewthread.php?tid=769040&extra=&page=3
把 脚本改成这样就可以了:
#!/bin/bash
testNum=3
declare -a ips
ips[0]=10.22.16.202
ips[1]=10.12.16.203
ips[2]=10.22.16.204
if [ $# != 1 ]; then
echo "please input find file "
else
FINDFILE=$1
fi
exec 3<FINDFILE
while read LINE <&3
echo $ LINE
i=0
while [ $i -lt $testNum ]
do
echo ${ips[$i]}
echo $ LINE
ssh -oPort=20 ${ips[$i]} "cd /data/test/testPath;grep '$ LINE *.txt"
ssh -oPort=20 ${ips[$i]} "cd /data2/test/testPath;grep '$ LINE *.txt"
i=$(($i+1))
done
done
解释如下:
问题的关键在于:
read从输入读取了一行内容后,
其它的程序(比如 rsh或sed)从同样的地方把其它的输入读走了,
read当然读不到其它内容了,
while也就结束了
改成
exec 3<urfile
while read var <&3
do
....
done
这种模式就可以了。
原来的情况是 FD1 ===>read FD1 ===>sed
后来的情况是 FD3 ===>read FD1 ===>sed
相关文章推荐
- 读取文件,取出第一行出现\ufeff问题(编码问题)
- PHP读取txt文件,第一行不能被正确识别的问题
- shell 按行读取文件的问题
- shell大文件读取并处理的问题
- bufferedReader 读取文件第一行第一个字符丢失问题
- python读取文件中的第一行出现编码问题
- java读取txt文件第一行遇到的问题
- java中读取UTF-8文件时有时会出现第一行乱码问题
- 通过Shell脚本读取properties文件中的参数时遇到\r换行符的问题
- shell脚本格式问题导致读取不到文件状态
- Java IO读取文件中文乱码问题
- JAVA读取文件操作时路径的斜杠问题
- shell读取文件每行,并执行命令
- 逆向遍历QTreeWidget读取文件路径的问题
- java读取隐藏文件的问题
- shell读取文件的每一行
- 解决docker内运行java读取文件问题
- mybatis3.0x升级整合spring问题(读取不到properties文件属性)
- 每次读取指定目录、指定数量的文件shell脚本
- Java读取文件时第一行出现乱码“?”问号