Результаты кошки grep

Я пытаюсь объединить результаты поиска 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 

Спасибо

4 Solutions collect form web for “Результаты кошки grep”

Если вы пытаетесь bigfile содержимое совпадающих файлов в один bigfile , вам необходимо передать имена файлов в cat как различные аргументы: вы можете сделать это с помощью xargs

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

Добавление флагов -Z и -0 передает имена с использованием пустых ограничителей, позволяя команде работать с любыми юридическими именами файлов (включая те, которые содержат пробелы или новые строки).

  1. cat здесь ничего не делает. Простое перенаправление вывода tr фактически совпадает с переходом на cat и перенаправление.

  2. Попробуйте paste вместо tr . Например:

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

  3. xargs работает, и имеет преимущество в том, что он xargs вывод на несколько строк, если / когда он достигает максимальной длины командной строки:

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

Кстати, почему даже имеет значение, если файлы перечислены по одному в каждой строке или все на одной строке? Если вы намереваетесь использовать его в командной строке другой программы или в качестве входных данных for цикла for или while, вам, вероятно, будет лучше с одним именем файла в каждой строке, особенно если в имени файла есть файлы с пробелами.

Нет необходимости в последнем канале / cat, вы можете перенаправить его в файл сразу после tr

Может использовать ваш код:

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

Это даст вам:

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

Вы можете использовать paste с параметром – s (serialize), чтобы получить все строки в одном.

В твоем случае:

 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 
  • Нумерация результатов grep
  • только найти уникальные результаты в grep
  • Какое из следующего использования якоря является правильным в регулярном выражении с помощью grep?
  • Скопируйте файлы с определенным расширением из множества вложенных подкаталогов в один каталог и добавьте к каждому скопированному файлу имя каталога.
  • сделать вывод grep без конечной новой строки
  • использование апострофа в grep rexExp
  • ls выводит несколько столбцов, даже если отправлен в grep с помощью zml-конфигурации grml
  • Отображение имен файлов с помощью grep
  • Как распечатать только первое совпадение из каждой строки?
  • grep и скобки в тексте
  • Как запустить несколько команд AND в команде grep
  • Linux и Unix - лучшая ОС в мире.