从命令输出行

时间:2016-07-10 20:36:44

标签: bash shell awk sed grep

运行终端命令以下列形式打印输出:

  

一些不相关的文字
  更无关的文字
  值A = 3.14
  值B = 2.71
  也是不相关的文字

我需要shell命令(或awk),它将获得对应于VALUE A(3.14)和VALUE B(2.71)的浮点值,并根据前面的字符串将它们分配给shell变量。使用字符串作为标识并以这种格式提取这些特定行非常重要。

可以避免,但可以将命令输出临时存储在文本文件中进行处理。

3 个答案:

答案 0 :(得分:2)

对于您提供的输入,这将按照您的要求执行:

$ declare $(mycommand | sed -n 's/^\([^=]*\) = /\1=/p' | tr ' ' '_')
$ echo $VALUE_A
3.14
$ echo $VALUE_B
2.71

sed脚本会从mycommand(您的数据生成器)中挑选出任意一行,其中包含=左侧单个空格所包围的tr,删除这些空格并传递它的输出为declare,它将用下划线替换空格。 input在当前shell中执行赋值,创建新的环境变量。

分步骤(包含$ cat input some irrelevant text more irrelevant text VALUE A = 3.14 VALUE B = 2.71 also irrelevant text $ cat input | sed -n 's/^\([^=]*\) = /\1=/p' VALUE A=3.14 VALUE B=2.71 $ cat input | sed -n 's/^\([^=]*\) = /\1=/p' | tr ' ' '_' VALUE_A=3.14 VALUE_B=2.71 中的示例数据):

declare

... override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { print("Touched") } 将这些作业带出来。

答案 1 :(得分:1)

没有&#34;无关的文字&#34;。如果你的&#34;不相关的文字&#34;例如,包含=符号,然后某些解决方案将中断。如果它是多线的,其他解决方案将会中断,等等。你必须告诉我们更多关于那个&#34;不相关的文字&#34;如果您想获得一个强大的解决方案,请在示例输入/输出中使用一个具体示例。

话虽如此,一个可能的解决方案取决于你的&#34;无关的文字&#34;要求是:

$ declare $( cat file | awk -F' *= *' -v OFS='=' 'NF>1{gsub(/ /,"_",$1); print}' )

$ echo "$VALUE_A"
3.14
$ echo "$VALUE_B"
2.71

另:

$ declare $( cat file | awk -F' *= *' -v OFS='=' 'NR>2 && NR<5{gsub(/ /,"_",$1); print}' )

cat file替换为您正在执行的任何命令,以生成您在问题中显示为示例输入的输出。

有了这个和任何其他解决方案,因为你还没有告诉我们什么&#34;无关的文字&#34;可以/不能包含,您可能会发现文字并不像您所喜欢的那样无关紧要,因为它可能符合我们假设仅存在于&#34中的模式;相关&#34;线。

答案 2 :(得分:0)

执行命令

while read -r a b c d; do [ "$a" = VALUE ] && [ "$c" = = ] && declare "VALUE_$b=$d"; done < <(command)

或者,如果您更喜欢分布在多行上的命令:

while read -r a b c d
do
  [ "$a" = VALUE ] && [ "$c" = = ] && declare "VALUE_$b=$d"
done < <(command)

这需要bash。

如何运作

  • while read -r a b c d; do

    这会启动循环并从标准输入读取,将其分为单词并分配变量abcd

  • [ "$a" = VALUE ] && [ "$c" = = ] && declare "VALUE_$b=$d"

    如果a为VALUE且c为等号,则创建名为VALUE_$b且值为$d的shell变量。

  • done

    这标志着循环的结束。

  • < <(command)

    这为command的输出提供了循环输入。

    第一个<表示应该重定向循环的输入。构造<(...)通过进程替换command的输出提供输入。