如何创建包含“foo”的文件行备份

时间:2013-04-04 13:06:29

标签: bash grep find

基本上我有一个目录和子目录需要扫描才能找到.csv文件。从那里我想将所有包含“foo”的行从找到的csv复制到新文件(与原始文件位于同一目录中),但名称反映了它所在的文件。

到目前为止我已经

find -type f -name "*.csv" | xargs egrep -i "foo" > foo.csv

产生一个备份文件(foo.csv),其中包含所有内容,并且找到它的位置是数据的一部分。这两个我都不想要。

我想要的是什么:

例如,如果我有:

csv1.csv
csv2.csv

并且它们都有包含“foo”的行,我希望将这些行复制到:

csv1_foo.csv
csv2_foo.csv

我没有在备份中输入任何额外内容,除了原始文件中包含“foo”的完整行。即我不希望备份数据中的原始文件名,这是我当前的代码所做的。

另外,我想我应该注意到我正在使用egrep,但我的例子不使用正则表达式。当我将其应用于我的特定场景时,我将在搜索中使用正则表达式,因此在命名新文件时可能需要考虑这一点。如果这看起来太难了,那么一个不考虑正则表达式的答案就没问题了。

提前致谢!

3 个答案:

答案 0 :(得分:1)

你可以试试这个:

$ find . -type f -exec grep -H foo '{}' \; | perl -ne '`echo $2 >> $1_foo` if /(.*):(.*)/'

它使用:

  • find迭代文件
  • grep打印file path:line元组(-H切换)
  • perl将这些行回显到输出文件(使用反斜杠,但它可以做得更漂亮)。

答案 1 :(得分:1)

您也可以尝试:

find -type f -name "*.csv" -a ! -name "*_foo.csv" | while read f; do
   grep foo "$f" > "${f%.csv}_foo.csv"
done

答案 2 :(得分:1)

尝试这个,无论如何都要帮助它。

find -type f -name "*.csv" | xargs -I {} sh -c 'filen=`echo {} | sed 's/.csv//' | sed "s/.\///"` && egrep -i "foo" {} > ${filen}_foo.log'