【问题标题】:Bash - run command using lines from text fileBash - 使用文本文件中的行运行命令
【发布时间】:2013-02-04 00:24:59
【问题描述】:

我对 bash 脚本有点陌生,并且无法找到我要问的问题的答案,也就是说,如果可能的话。

我有一个文本文件,它是通过使用 grep 在目录中搜索包含“名称”的文件并输出以下内容创建的,例如文件名为 PathOutput.txt

/mnt/volnfs3rvdata/4007dc45-477a-45b2-9c28-43bc5bbb4f9f/master/vms/4c3483af-b41a-4979-98b7-6f6a4f147670/4c3483af-b41a-4979-98b7-6f6a4f147670.

/mnt/volnfs3rvdata/4007dc45-477a-45b2-9c28-43bc5bbb4f9f/master/vms/5b5538a5-423f-4eaf-9678-d377a6706c58/5b5538a5-423f-4eaf-9678-d377a6706c58.

/mnt/volnfs3rvdata/4007dc45-477a-45b2-9c28-43bc5bbb4f9f/master/vms/0e2d1451-45cc-456e-846d-d174515a60dd/0e2d1451-45cc-456e-846d-d174515a60ddf.ov.

/mnt/volnfs3rvdata/4007dc45-477a-45b2-9c28-43bc5bbb4f9f/master/vms/daaf622e-e035-4c1b-a6d7-8ee209c4ded6/daaf622e-e035-4c1b-a6d7-8ee209c4ded6.ovf

/mnt/volnfs3rvdata/4007dc45-477a-45b2-9c28-43bc5bbb4f9f/master/vms/48f52ab9-64df-4b1e-9c35-c024ae2a64c4/48f52ab9-64df-4b1e-9c35-c024ae2a64c4.ovf

现在,如果可能的话,我想做的是用命令循环文件,使用一个变量来引入文本文件中的每一行。但是我无法找到一种方法来对每一行再次运行命令。在我所有的游戏中,我确实得到了一个结果,它会在第一行运行一次,但这是当 grep 的输出通过管道传输到另一个命令时。

目前在 bash 脚本中,我只是提取到 PathOutput.txt 的路径,cat 以显示路径,然后将我想要的路径复制到 read -p 命令以创建一个针对命令运行的变量。它现在工作正常,只需每次为每个路径运行脚本。如果我可以让命令循环遍历每一行,我可以将结果输出到 txt 文件。

有可能吗?

【问题讨论】:

    标签: bash variables loops


    【解决方案1】:

    你可以使用xargs:

    $ xargs -n1 echo "arg:" < file
    arg: /mnt/volnfs3rvdata/4007dc45-477a-45b2-9c28-43bc5bbb4f9f/master/vms/4c3483af-b41a-4979-98b7-6f6a4f147670/4c3483af-b41a-4979-98b7-6f6a4f147670.ovf
    arg: /mnt/volnfs3rvdata/4007dc45-477a-45b2-9c28-43bc5bbb4f9f/master/vms/5b5538a5-423f-4eaf-9678-d377a6706c58/5b5538a5-423f-4eaf-9678-d377a6706c58.ovf
    arg: /mnt/volnfs3rvdata/4007dc45-477a-45b2-9c28-43bc5bbb4f9f/master/vms/0e2d1451-45cc-456e-846d-d174515a60dd/0e2d1451-45cc-456e-846d-d174515a60dd.ovf
    arg: /mnt/volnfs3rvdata/4007dc45-477a-45b2-9c28-43bc5bbb4f9f/master/vms/daaf622e-e035-4c1b-a6d7-8ee209c4ded6/daaf622e-e035-4c1b-a6d7-8ee209c4ded6.ovf
    arg: /mnt/volnfs3rvdata/4007dc45-477a-45b2-9c28-43bc5bbb4f9f/master/vms/48f52ab9-64df-4b1e-9c35-c024ae2a64c4/48f52ab9-64df-4b1e-9c35-c024ae2a64c4.ovf
    

    只需将echo "arg:" 替换为您实际要使用的命令即可。如果您想一次传递所有文件,请删除 -n1 选项。

    【讨论】:

    • 谢谢你这对我需要的东西有用。刚才输入的逗号 xargs -n1 awk 'BEGIN[FS="Name>";RS"/"]{print $2}' Outputofawk.txt 只需要从这个清理结果就应该是在职的。谢谢
    【解决方案2】:

    如果我理解正确,你可能想要这样的东西:

    for L in `cat PathOutput.txt`; do
        echo "I read line $L from PathOutput.txt"
        # do something useful with $L
    done
    

    【讨论】:

    • 我认为使用&lt; file 构造更可取,例如while read L; ...; done &lt; PathOutput.txt
    • 稍微调整一下就可以工作了,目前我会坚持使用 xargs 作为它的一行。感谢您提供的建议。我会给你一个投票,但我的代表不够高!!!!!! CAT=$(cat VMHEX_F.txt) for Line in $CAT do awk 'BEGIN{FS="Name>";RS="/"}{print $2}' $Line > Ifthisworks.txt done
    猜你喜欢
    • 2012-04-07
    • 2014-07-31
    • 2023-04-02
    • 1970-01-01
    • 2018-07-14
    • 2017-06-13
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    相关资源
    最近更新 更多