grep検索結果をリンクしようとしています。私のgrep検索は私のシステムで約4つのファイルを見つけ、各ファイルに対して新しい行に出力しました。私はこの情報を渡すことでtr '\n' ' '
検索に含まれるすべてのファイルを1行にインポートし、それを大きなファイルに渡して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
しかし、ファイルが1行に1つずつリストされているのか、それともすべて1行にリストされているのかがなぜ重要ですか?これを別のプログラムのコマンドラインで使用するか、for
ループへの入力として使用する予定の場合は、while
とにかく1行に1つのファイル名を使用する方が良いかもしれません。特にファイル名に空白文字があるファイルがある場合にはさらにそうです。
答え3
最後のパイプ/catは必要ありません。 tr 次のファイルに直接リダイレクトできます。
次のコードを使用できます。
egrep -Rl' ユーザー。 *ログ|ログ。 * user '/home/moose/test | tr '\n' ' ' > 大容量ファイル
これにより、以下が提供されます。
/ホーム/ムース/テスト/ファイル1 /ホーム/ムース/テスト/2 /ホーム/ムース/テスト/3 /ホーム/ムース/ムース/ファイル4
答え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