将grep搜索的输出写入单个文件

时间:2014-06-22 19:52:34

标签: bash shell grep

我有for循环,我用它来遍历关键字列表。然后我使用grep函数搜索另一个文件中的每个单词,然后将其写入另一个文件。问题是程序删除了循环的前一次迭代中的所有内容,因此我只留下文件中最后一个关键字的输出。如何将每个输出写入同一文件的新行?

这是我的代码。我为noob问题道歉 - 我是新手。谢谢!

#!/bin/bash

for i in $(cat file1.txt); do
        grep $i file2.txt>file3.txt 
done

2 个答案:

答案 0 :(得分:2)

>创建一个新文件并附加到该文件。 >>创建一个新文件附加到现有文件。

顺便说一下,循环使用这个文件的推荐方法是使用while循环,这样可以避免使用useless use of cat award。另外,Use More Quotes

while read -r pattern
do
    grep "$pattern" file2.txt >> file3.txt
done < file1.txt

答案 1 :(得分:2)

您正在覆盖该文件,因为您使用的是>(使用>>),但我认为根本不需要循环。如果您的所有模式都在file1.txt,那么您可以这样做:

grep -f file1.txt file2.txt > file3.txt

-f开关意味着模式是从file1.txt获得的,一次一行。

修改

我刚刚意识到你的单词并非都在单独的行中,所以你可以坚持使用你的循环(使用类似l0b0 has suggested之类的东西),或者你也可以将你的文件变成正确的格式(例如,使用awk):

grep -f <(awk -v RS='\\s+' '1' file1.txt) file2.txt > file3.txt

short awk命令将file1.txt中的所有单词放在不同的行上。默认情况下,每个“记录”都在一个单独的行上,但我已将RS(记录分隔符)的值更改为一个或多个空白字符\s+1是一种常用的简写,这意味着awk会打印每条记录(因为1计算为“true”)。默认行为是在单独的行上打印每条记录。