使用bash循环遍历csv文件中的行

时间:2013-04-15 23:43:44

标签: bash csv while-loop

即使.csv文件中有2个条目(行),这个while循环如何只执行一次?
为什么没有文件/目录匹配表达式,字符串'ls:/ root / heapdump :没有这样的文件或目录'也输出到控制台?

#!/bin/bash

INPUT=targets.csv

[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while IFS=, read target user password path
do
    result=$(sshpass -p "$password" ssh "$user"@"$target" ls "$path"*heapdump*)

    if [ $? -ne 0 ]
    then
            echo "No Heap dumps detected."
    else
            echo "Found a Heap dump! Possible OOM issue detected"
    fi

done < $INPUT

.csv内容..

rob@laptop:~/scripts$ cat targets.csv 
server.com,root,passw0rd,/root/
server.com,root,passw0rd,/root/

输出..

rob@laptop:~/scripts$ ./checkForHeapdump.sh 
ls: /root/*heapdump*: No such file or directory
No Heap dumps detected.

2 个答案:

答案 0 :(得分:0)

ssh正在从标准输入读取,因此在第一次迭代期间它正在填充CSV文件的其余部分。改为:

result=$(sshpass -p "$password" ssh -n "$user"@"$target" ls "$path"*heapdump*)

-n选项将ssh stdin重定向到/dev/null

关于错误消息,这是您执行以下操作时的正常错误输出:

ls filename-or-wildcard

并且没有匹配。如果您不想看到,请重定向stderr:

result=$(sshpass -p "$password" ssh -n "$user"@"$target" ls "$path"*heapdump* 2>/dev/null)

答案 1 :(得分:0)

我猜你的CSV文件的最后一行没有以回车符结束。

当发生这种情况时,read将填充变量但没有回车符来终止该行,它将转而到达文件的末尾,因此循环将不会执行。

如果您无法确认最后一行将以回车符终止,并且无法通过将echo >> targets.csv放在脚本的开头添加一个来编辑文件,那么您可以在之后检查变量循环来对他们采取行动。要做到这一点,我会在循环结束时清除其中一个变量,这样你就可以简单地测试它是否为非零长度,以便知道有一条最终的未处理行。