【问题标题】:Printf two var's into a file将两个 var 打印到一个文件中
【发布时间】:2013-09-30 19:25:59
【问题描述】:

我有一个 IP 列表,我想将其 snmpget 到一个文件中。我在将输出写入文件时遇到问题。

 OID=1.3.6.1.2.1.25.3.2.1.3.1
 cat printers.csv | while read IP ; do
        OUT=$(snmpget -v1 -c public $IP $OID)
        printf '%s, %s\n' $IP $OUT >> printerNames.csv
 done

我是 printf 命令的新手。我猜这就是它搞砸了 bc 输出被错误地写入的地方。此外,当没有响应时,它会回显到控制台,我希望将其写入输出文件。任何帮助将不胜感激。

【问题讨论】:

    标签: linux bash printf snmp


    【解决方案1】:

    试试这个:

    OID=1.3.6.1.2.1.25.3.2.1.3.1
    while read IP ; do
        OUT=$(snmpget -v1 -c public "$IP" "$OID") && printf '%s, %s\n' "$IP" "$OUT"
    done < printers.csv 2>&1 > printerNames.csv
    

    除非您有充分的理由不这样做,否则总是引用参数扩展是个好主意。重定向应用于while 循环。 read 将从输入文件中一次读取一行(不需要cat);写入标准错误的任何内容都会被复制到标准输出,并且标准输出(包括错误)被重定向到输出文件。 printf 仅在 snmpget 命令成功时执行(我假设如果查找失败,它具有非零退出状态;可能并非如此)。


    听起来printers.csv 有 DOS 行尾 (\r\n)。回车作为每行的最后一个字符包含在内。当您打印$IP 时,它会打印地址,然后是回车,这会将光标移回行首。这会导致行的其余部分 (, $OUT) 覆盖地址。要删除回车,请通过dos2unix 运行输入文件,或使用其他方法将 DOS 行尾转换为 UNIX 行尾(仅\n)。

    【讨论】:

    • $OUT 现在可以正确写入但$IP 没有被写入并且stderr 没有被重定向?输出看起来像, iso.3.6... = STRING: "HP LaserJet P3005",这是正确的输出。
    • 2&gt;&amp;1 必须放在 之后 &gt;printerNames.csv 才能被重定向到同一个文件,否则它将被重定向到 old标准输入。
    • Sir Athos 纠正了错误重定向,但由于某种原因 $IP 没有被写出。是否可以printf 2 个变量?
    • 当然。像while read IP; do printf '%s\n' "$IP"; done &lt; printers.csv 这样的简单循环有什么作用?
    • 实际上,听起来printers.csv 有DOS 行尾。通过dos2unix 运行它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多