【问题标题】:Unix Shell Scripting - Add Extra Column In While LoopUnix Shell 脚本 - 在 While 循环中添加额外的列
【发布时间】:2017-08-08 01:20:57
【问题描述】:

我有一个文件 server.txt 包含不同的主机名,例如:

hostname1.com
hostname2.com

我的 shell 脚本 servers.sh 是为了从 servers.txt 文件的列表中获取 /etc/passwd/etc/group 文件。

我希望在我的最终输出文件中添加条目来自的主机名。我的脚本如下所示:

while read HOST ;
        do
           sshpass -p $password ssh -n $username@$HOST 'cat /etc/passwd'>>users.txt
           sshpass -p $password ssh -n $username@$HOST 'cat /etc/group'>>groups.txt
done < servers.txt
echo -e "UserName;UID;GID;HomeDir;Shell" > final_users.csv
cut -d: -f1,3,4,6,7 users.txt  | tr ':' ';'>> final_users.csv
echo -e "GroupName;GID;Members" > final_groups.csv
awk -F '[:,]' '{for(i=4;i<=NF;i++)print$1";"$3";"$i}' groups.txt >> final_groups.csv

目标是在final_users.csvfinal_groups.csv 中添加另一列,例如hostname,这样我就可以知道每个条目来自哪些服务器。

【问题讨论】:

    标签: bash shell loops unix while-loop


    【解决方案1】:

    我想我明白了:

    while read HOST ;
            do
               sshpass -p $password ssh -n $username@$HOST 'cat /etc/passwd'>>users_1.txt
               while IFS= read -r line; do echo "$line:"$HOST; done < users_1.txt >> users_2.txt
               sshpass -p $password ssh -n $username@$HOST 'cat /etc/group'>>groups_1.txt
               while IFS= read -r line; do echo "$line:"$HOST; done < groups_1.txt >> groups_2.txt
    done < servers.txt
    echo -e "UserName;UID;GID;HomeDir;Shell;Hostname" > final_users.csv
    cut -d: -f1,3,4,6,7,8 users_2.txt  | tr ':' ';'>> final_users.csv
    echo -e "GroupName;GID;Members;Hostname" > final_groups.csv
    awk -F'[:,]' -v OFS=';' '{for(i=4;i<NF;i++) print $1, $3, $i, $NF}' groups_2.txt >> final_groups.csv
    

    【讨论】:

      【解决方案2】:

      试试这样:

      while read HOST ;
              do
                 sshpass -p $password ssh -n $username@$HOST 'cat /etc/passwd'>>users.txt
                 sshpass -p $password ssh -n $username@$HOST 'cat /etc/group'>>groups.txt
      done < servers.txt
      echo -e "UserName;UID;GID;HomeDir;Shell;Hostname" > final_users.csv
      echo "`cut -d: -f1,3,4,6,7 users.txt  | tr ':' ';'`;$HOST">> final_users.csv
      echo -e "GroupName;GID;Members;Hostname" > final_groups.csv
      echo "`awk -F '[:,]' '{for(i=4;i<=NF;i++)print$1";"$3";"$i}' groups.txt`;$HOST" >> final_groups.csv
      

      【讨论】:

      • 不添加任何内容。它将如何在 while 循环之外添加 $HOST 变量?
      • 你是对的。您可以逐行执行,使用 sed 将行尾替换为 $HOST 或使用 paste 命令进行一些 bash-hacking。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      • 2019-12-10
      • 1970-01-01
      相关资源
      最近更新 更多