【问题标题】:linux - for loop with awklinux - 带有 awk 的 for 循环
【发布时间】:2020-11-07 17:12:34
【问题描述】:

我的文件有以下数据

IP      USER    PASSWORD
ip1     user1   password1
ip2     user2   password2
ip3     user3   password3

所以我在下面写了同样的脚本

#!/bin/bash

for val in  `awk 'NR>1 {print}' servers.list`
do
        echo  $val
done

但是 for 循环已经执行了 9 次,如果我在引号中写了 awk 命令,那么它只执行一次。

如何编写脚本,以便 for 循环将每一行视为单个,以便我可以解析每一行并可以使用 pscp 将数据复制到多个服务器。

命令

pscp -p mypassword /home/user/myfile.txt user@ip:/home/user/myfile.txt

如果有任何更好的方法可以将文件复制到多个服务器然后请 指定它 bcz 我是脚本新手。

【问题讨论】:

  • 为什么需要用awk运行shell循环。 awk 无需任何循环即可轻松生成相同的输出。
  • @anubhava 我正在学习脚本,所以如果你能分享你的知识或任何博客(如果已经在那里描述),那么我将不胜感激。顺便说一句,我也需要执行pscp 命令,这就是我这样做的原因。
  • 你能分享一个pscp命令的例子吗?
  • @anubhava pscp -p mypassword /home/user/myfile.txt user@ip:/home/user/myfile.txt
  • 首先将您的代码复制/粘贴到shellcheck.net 并修复它告诉您的问题。

标签: linux bash awk


【解决方案1】:

听起来你真正需要的是:

while read -r ip user password; do
    pscp -p "$password" "/home/${user}/myfile.txt" "${user}@${ip}:/home/${user}/myfile.txt"
done < <(tail -n +2 servers.list)

这实际上与您在问题顶部提出的问题无关。

以上假设在您的servers.list 文件中的字段中没有空格,也没有其他不需要的字符。

【讨论】:

    【解决方案2】:

    试试:

    $ awk 'NR>1 {printf "IP --> %s, user --> %s, password --> %s\n",$1,$2,$3}' servers.list
    IP --> ip1, user --> user1, password --> password1
    IP --> ip2, user --> user2, password --> password2
    IP --> ip3, user --> user3, password --> password3
    

    当您想要格式化输出时,例如在您的示例中,printf 非常有用。命令格式为printf fmt, expr-list,其中fmt 是一个带有占位符的字符串,例如%s,这些占位符由表达式列表中的值填充。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-31
      • 2012-06-04
      • 1970-01-01
      • 2013-10-08
      • 2014-01-09
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多