CentOS 5.x
我正在尝试构build一个shell脚本来search通过stdin提供的数据。 这是一个inputstream的例子:
Date: 1/1/11 Time: 12:00 AM Foo: 12345 Foo1: dskjflsdkjflksdjlfds Foo2: 123456789 Foo3: kdsjflskdjflkjsdlkfjsdlkjflksdjflkjsdklfjlksdjflk
这个信息不存在于一个文件中,它只能作为另一个应用程序的stdout实时发送到脚本。
我想要看看这些数据,并parsing出Foo:和Foo2的值:将它们存储为variables,以便以后在脚本中使用。
我修改的脚本尝试是这样的:
#!/bin/bash while read data; do SearchCriteria1=$(echo "$data" | grep "Foo: " | cut -c 5-) SearchCriteria2=$(echo "$data" | grep "Foo2: " | cut -c 6-) echo $SearchCriteria1 >> test.1 echo $SearchCriteria2 >> test.2 done
完成的脚本实际上不会使用test.1或test 2文件。 我只是把它们列在这里,以方便举例。
在这个例子中,我期望test.1具有:
12345
在这个例子中,我希望test.2具有:
123456789
当我testing这个虽然,test.1和test.2都是空白的,我知道数据有它的有效信息。
我错过了一些明显的东西。 有人可以澄清?
想想你的greps从哪里得到他们的input。 你已经给他们没有input文件名,所以他们正在从标准input读取。 他们的标准input是什么? 它没有redirect,并且没有pipe道进入greps,所以它们使用循环的inheritance标准input运行。
read只执行一次。 它读取到$data的第一行,这是你永远不会在任何地方使用(这应该是一个错误的线索)。 然后,第一个grep运行,它消耗所有的input,第二个grep被连接到相同的input,所以它得到立即EOF。
这可能更接近你想要的:
SearchCriteria1=$(echo "$data" | grep "Foo " | cut -c 10-) SearchCriteria2=$(echo "$data" | grep "Foo2 " | cut -c 13-)
最后的分号无用,所以我把它们取走了。
另外你可能test.1和test.2否则循环中的每个迭代都会覆盖前面的内容。
看大图,看起来你想要一个“多输出grep”。 你的阅读循环与每个线grep的是一种方式来实现它,但效率不高。 最近在https://stackoverflow.com/questions/11676350/grepping-a-20g-file-in-bash/11676853上讨论了其他一些方法
input stream producer | egrep 'Foo:|Foo2:' | while read foo data do case $foo in Foo:) echo "do something with $foo -- $data" ;; Foo2:) echo "do something else with $foo -- $data" ;; esac done
egrep行不是绝对必要的,但是为循环删除了不必要的input。 然后读入两个variables( foo和data )和用例在它们之间进行select并相应地执行(如果需要,可以在此阶段将数据分配给另一个variables)。
这个怎么样:
$ ./another.app | awk '/Foo: / { print $2 }' > test.1 $ ./another.app | awk '/Foo2: / { print $2 }' > test.2