我正在尝试连接 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
cat
这里什么也不做。简单地重定向 的输出tr
实际上与通过管道将其输出并重定向相同cat
。尝试
paste
代替tr
.例如:egrep -Rl 'users.*log|log.*users' /home/moose/test | paste -sd' ' > bigfile
xargs
也可以工作,并且具有在达到命令行最大长度时将输出分成多行的优点:egrep -Rl 'users.*log|log.*users' /home/moose/test | xargs > bigfile
顺便说一句,为什么文件是每行列出一个还是全部列在一行上也很重要?如果您打算在另一个程序的命令行中使用它或作为for
orwhile
循环的输入,那么无论如何,每行一个文件名可能会更好,特别是如果文件名中存在任何带有空格字符的文件。
答案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