【问题标题】:Save the multiline output of 'grep | cut' to a variable保存 'grep | 的多行输出切'到一个变量
【发布时间】:2012-10-06 14:16:59
【问题描述】:

我是新来的,我会尽力解释我的问题:)

我想写一个备份脚本来保存KVM使用的所有lv

操作系统:Ubuntu 服务器 x64 12.04

重击 4.2.24

XML 文件内容:

<source file='/dev/vg1/lv1'/>
<source file='/dev/vg1/lv2'/>

我的 grep/cut 命令

grep "<source file='.*.'/>" /backup/$SRCNAME/$DATUM/$SRCNAME.xml | cut -f2 -d"'" | cut -f4 -d"/"

这个输出

lv1
lv2

如何让它对每个输出做一些事情 - 将输出存储在数组中是最好的方式吗?

我已经搜索了 2 天的答案 :( 我尝试了一些循环和管道,但没有任何效果,因为我的 grep 命令太具体了:/

【问题讨论】:

  • 你想对输出做什么?你的意思是把结果传给xargs
  • 对了,你可以把grepcut组合成:sed -n "s/&lt;source file='\/.*\/\(.*\)'\/&gt;/\1/p" /backup/$SRCNAME/$DATUM/$SRCNAME.xml
  • 我只需要输出来创建逻辑卷的快照然后压缩它们。如果虚拟机可以有不同数量的硬盘,那么我需要将它们读出并循环它:) 也尝试使用 sed 但它总是给我类似miss s end tag 的东西现在试试你的线:)

标签: arrays bash variables grep cut


【解决方案1】:

将其保存到数组中:

array=( $(grep "<source file='.*.'/>" /backup/$SRCNAME/$DATUM/$SRCNAME.xml | cut -f2 -d"'" | cut -f4 -d"/")

您也可以将其通过管道传输到循环中:

grep "<source file='.*.'/>" /backup/$SRCNAME/$DATUM/$SRCNAME.xml | cut -f2 -d"'" | cut -f4 -d"/" | while read lv; do
    echo "$lv"
done

但是请注意,由于管道的原因,循环可能会在子 shell 中运行,因此对变量的更改不会传播回父 shell。

希望这会有所帮助 =)

【讨论】:

  • 数组是特定于 bash 的。 Bourne Shell 或 dash(常见的 sh shell)不支持它们。试试bash /tools/backup.sh
  • # sh /tools/backup.sh -s vm5 /tools/backup.sh: 48: /tools/backup.sh: Syntax error: "(" unexpected 该死的 ~.~ 使用 bash 而不是 sh,非常感谢!! >.
  • 没问题 =) 很高兴我能帮上忙!
猜你喜欢
  • 2016-07-27
  • 2023-02-13
  • 1970-01-01
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2011-11-10
相关资源
最近更新 更多