【问题标题】:process file line by line does not work in ksh逐行处理文件在ksh中不起作用
【发布时间】:2018-08-23 16:28:19
【问题描述】:

这看起来很简单,但如果我尝试对从文件中读取的数据进行任何处理,我不确定为什么它不会超出第一行。

代码:

while IFS="" read -r line
do
 u=`echo $line | awk '{print $4}'`
 h=`echo $line | awk '{print $2}'|cut -f1 -d'.'`
 echo "$h : $u"
 ssh $h grep $u /etc/shadow
done < "/var/tmp/user_data"

user_data 是一个文件,每个用户/系统都有一行,例如:

xxx unixhost01  xxx admin69 xxx... ....
xxx host xxx uid xxx... ...
    ...
    ...

当我运行此代码时,它仅适用于第一行然后退出。在 shell 中调试显示没有问题。当我在没有 ssh 操作/命令的情况下运行它时,它会处理整个数据文件。

shell 是 ksh:

# ps
   PID TTY         TIME CMD
  1424 pts/138     0:00 ps
 18521 pts/138     0:02 ksh

在执行时只打印(第一行):

unixhost01 : admin69
admin69:$1$gFfcEQETGZAo6W0:17599:0:90:10:::

有什么想法吗?

【问题讨论】:

    标签: loops unix while-loop ksh do-while


    【解决方案1】:

    问题在于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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      相关资源
      最近更新 更多