grep 的 cat 结果

grep 的 cat 结果

我正在尝试连接 grep 搜索的结果。我的 grep 搜索在我的系统上找到了大约 4 个文件,并将它们输出到每个文件的新行中。我认为通过将此信息传递给tr '\n' ' '我可以在一行中获取搜索中的所有文件,然后将其传递给cat > bigfile大文件以包含我搜索中的所有文件内容。相反,bigfile仅包含 grep 找到的文件列表。

如何bigfile包含 grep 找到的所有文件的串联。

这是我尝试过的代码:

egrep -Rl 'users.*log|log.*users' /home/moose/test | tr '\n' ' ' | cat > bigfile

然后bigfile包含:

/home/moose/test/file1 /home/moose/test/2 /home/moose/test/3 /home/moose/moose/file4 

谢谢

答案1

如果您尝试连接内容匹配的文件到单个bigfile,然后您需要将文件名作为cat不同的参数传递:您可以使用xargs

egrep -ZRl 'users.*log|log.*users' /home/moose/test | xargs -0 cat

添加-Z-0标志会使用空分隔符传递名称,从而允许该命令处理任何合法文件名(包括包含空格或换行符的文件名)。

答案2

  1. cat这里什么也不做。简单地重定向 的输出tr实际上与通过管道将其输出并重定向相同cat

  2. 尝试paste代替tr.例如:

    egrep -Rl 'users.*log|log.*users' /home/moose/test | paste -sd' ' > bigfile

  3. xargs也可以工作,并且具有在达到命令行最大长度时将输出分成多行的优点:

    egrep -Rl 'users.*log|log.*users' /home/moose/test | xargs > bigfile

顺便说一句,为什么文件是每行列出一个还是全部列在一行上也很重要?如果您打算在另一个程序的命令行中使用它或作为fororwhile循环的输入,那么无论如何,每行一个文件名可能会更好,特别是如果文件名中存在任何带有空格字符的文件。

答案3

不需要最后一个管道/cat,可以直接重定向到tr后面的文件

可以使用您的代码,例如:

egrep -Rl '用户。*日志|日志。*用户' /home/moose/test | tr '\n' ' ' > 大文件

这会给你:

/home/moose/test/file1 /home/moose/test/2 /home/moose/test/3 /home/moose/moose/file4

答案4

您可以使用paste- s(序列化)选项来获取单行中的所有行。

在你的情况下:

grep .... | paste -sd'\t'

这里,-t表示分隔符,这里使用制表符作为分隔符,更改它以满足您的需要。

例子:

% printf 'foo\nbar\nspam\negg\n'               
foo
bar
spam
egg

% printf 'foo\nbar\nspam\negg\n' | paste -sd' ' 
foo bar spam egg

% printf 'foo\nbar\nspam\negg\n' | paste -sd'\t'
foo   bar   spam    egg

相关内容