Unix-在文件中查找模式,复制到另一个文件中

Unix-在文件中查找模式,复制到另一个文件中,unix,awk,grep,find,Unix,Awk,Grep,Find,我花了一些时间考虑如何解决这个问题,但我不确定,到目前为止,我对unix的使用相当有限 我有一个文本文件,让我们给它起个名字“text.txt”,它包含很多信息。假设它包含: SomethingA: aValue SomethingB: bValue SomethingC: cValue SomethingD: dValue SomethingD: anotherDValueThisTime SomethingA: aValueToIgnore 我想搜索“Text.txt”,找到一些值,然后将

我花了一些时间考虑如何解决这个问题,但我不确定,到目前为止,我对unix的使用相当有限

我有一个文本文件,让我们给它起个名字“text.txt”,它包含很多信息。假设它包含:

SomethingA: aValue
SomethingB: bValue
SomethingC: cValue
SomethingD: dValue
SomethingD: anotherDValueThisTime
SomethingA: aValueToIgnore
我想搜索“Text.txt”,找到一些值,然后将这些值放在一个新文件output.txt中

这变得有点棘手,因为我要做的是得到somethingA的第一个值,然后是发生的每个SomethingD值

所以“output.txt”中的输出应该是:

aValue
dValue
anotherDValue
第二个“SomethingA”值希望被忽略,因为这不是第一个“SomethingA”值

我认为逻辑是这样的: 查找SomethingA>output.txt 查找所有SomethingD的>>output.txt

但我就是不太明白。
非常感谢您的帮助

awk
是理想的选择

awk '/^SomethingA/ && ! a++ || /^SomethingD/ { print $2 }' FS=: text.txt > output.txt
这有点草率,但您可以更精确地使用:

awk '$1 == "SomethingA" && ! a++ || $1 == "SomethingD" { print $2 }' FS=: text.txt > output.txt
不幸的是,这需要一个固定的键字符串。如果需要正则表达式,可以执行以下操作:

awk 'match($1, "pattern") && ...
grep
选项
-m
设置要获得的最大匹配数


>
附加到文件,而不是像
那样覆盖它。

我认为您需要的是带有
-o
选项的
grep
命令。它的工作原理如下:

grep -o -e 'pattern1' -e 'pattern2' /tmp/1 >> /tmp/2

你在乎输入文件中的somethingD是否在somethingA之前吗?排序不是问题。只要所有的事情都在一起,事情的开始和结束都无关紧要。你们帮了我很多忙。感谢您的解决方案,我将花一些时间阅读awk。第一次,这个解决方案实际上非常有效。谢谢你。我刚刚看到你的第二个答案/进步。我只需要一个固定的字符串的钥匙,因为他们都将是相同的。再次感谢,我真的很感激。如果您想在awk中将字段与正则表达式进行匹配,可以使用
$1~/pattern/{stuff}
$1!~/pattern/{stuff}
@Stobor谢谢,这肯定更合适。我请求暂时失忆。
grep -o -e 'pattern1' -e 'pattern2' /tmp/1 >> /tmp/2