逐行处理文件在 ksh 中不起作用
process file line by line does not work in ksh
这看起来很简单,但我不确定如果我尝试对从文件中读取的数据进行任何处理,为什么它不会读取超过第一行的内容。
代码:
while IFS="" read -r line
do
u=`echo $line | awk '{print }'`
h=`echo $line | awk '{print }'|cut -f1 -d'.'`
echo "$h : $u"
ssh $h grep $u /etc/shadow
done < "/var/tmp/user_data"
user_data 是一个文件,每个 user/system 一行,例如:
xxx unixhost01 xxx admin69 xxx... ....
xxx host xxx uid xxx... ...
...
...
当我 运行 这段代码时,它只在第一行有效然后退出。 shell 中的调试显示没有问题。当我 运行 它没有 ssh operation/command 它处理整个数据文件。
shell 是 ksh:
# ps
PID TTY TIME CMD
1424 pts/138 0:00 ps
18521 pts/138 0:02 ksh
执行时仅打印(第一行):
unixhost01 : admin69
admin69:$gFfcEQETGZAo6W0:17599:0:90:10:::
有什么想法吗?
问题出在 ssh
本身,因为它消耗标准输入,所以下次您循环获取另一行时,就没有任何剩余了。您可以通过将命令更改为:
来验证这一点
ssh $h cat
并看到它在第一个 ssh
会话期间输出文件的其余部分。
您至少可以通过两种方式解决此问题,第一种方法是简单地断开您的ssh
与标准输入的连接:
ssh $h grep $u /etc/shadow </dev/null
第二个(如果您确实想要与目标框交互则需要)是使用不同的文件句柄作为输入文件流:
while IFS="" read -u3 -r line ; do # reads file #3
blah blah blah
done 3</var/tmp/user_data # sends data via file #3
这看起来很简单,但我不确定如果我尝试对从文件中读取的数据进行任何处理,为什么它不会读取超过第一行的内容。
代码:
while IFS="" read -r line
do
u=`echo $line | awk '{print }'`
h=`echo $line | awk '{print }'|cut -f1 -d'.'`
echo "$h : $u"
ssh $h grep $u /etc/shadow
done < "/var/tmp/user_data"
user_data 是一个文件,每个 user/system 一行,例如:
xxx unixhost01 xxx admin69 xxx... ....
xxx host xxx uid xxx... ...
...
...
当我 运行 这段代码时,它只在第一行有效然后退出。 shell 中的调试显示没有问题。当我 运行 它没有 ssh operation/command 它处理整个数据文件。
shell 是 ksh:
# ps
PID TTY TIME CMD
1424 pts/138 0:00 ps
18521 pts/138 0:02 ksh
执行时仅打印(第一行):
unixhost01 : admin69
admin69:$gFfcEQETGZAo6W0:17599:0:90:10:::
有什么想法吗?
问题出在 ssh
本身,因为它消耗标准输入,所以下次您循环获取另一行时,就没有任何剩余了。您可以通过将命令更改为:
ssh $h cat
并看到它在第一个 ssh
会话期间输出文件的其余部分。
您至少可以通过两种方式解决此问题,第一种方法是简单地断开您的ssh
与标准输入的连接:
ssh $h grep $u /etc/shadow </dev/null
第二个(如果您确实想要与目标框交互则需要)是使用不同的文件句柄作为输入文件流:
while IFS="" read -u3 -r line ; do # reads file #3
blah blah blah
done 3</var/tmp/user_data # sends data via file #3