Пожалуйста, скажите свою версию grepgrep --version
Кент
3
kent, grep --versionэто команда, используемая для определения версии grep? Если так, это не работает. Не удалось найти другую команду, чтобы узнать версию grep.
Вивек
2
хороший вопрос, но 'Os version' - это запутанный пример имени файла
HaveAGuess
1
ОС и версия здесь не имеет значения.
MD XF
grep 'pattern' *
user0
Ответы:
431
Попробуйте этот маленький трюк, чтобы убедить себя grepв том, что он имеет дело с несколькими файлами, и отобразить имя файла:
Да, это сработало. Подскажите, пожалуйста, в чем смысл добавления /dev/nullэтой команды?
Вивек
55
Если grepуказано несколько имен файлов, он будет автоматически отображать имена файлов перед совпадением, но не будет указывать имя файла в случае одного входного файла. Используя /dev/nullв качестве дополнительного входного файла, grep«думает», что он имеет дело с несколькими файлами, но / dev / null, конечно, пуст, поэтому он не будет отображаться в списке совпадений ..
Scrutinizer
32
использование / dev / null - хитрый трюк, но я думаю, что предложение ниже флага -H - лучший ответ.
JohnQ
22
Хорошо, но -Hопция для grep не является частью POSIX, а используемая ОС - Solaris 10, где ни у стандартной, ни у POSIX-совместимой версии grep такой -Hопции нет.
Тщательный анализ
4
Это важно, если вы используете grep с find, например, find . -name foo -exec grep pattern {} \;при условии, что fooв вашем подкаталоге много файлов, названных по- findпрежнему , все равно grepпредоставляется один файл для работы за раз. /dev/nullТрюк , кажется, работает во всех Linux / OSX ароматы , которые я пробовал, так что престижность! Заметьте, я думаю, что -Hэто чище, но, как упоминалось ниже, оно может не поддерживаться вашей версией grep.
Джон V
297
Если у вас есть варианты -Hи -nдоступны ( man grepэто ваш друг):
@codeforester Я не знаю других grep, поэтому я не знаю.
MD XF
2
Прохладно ! это работало для Linux. Если вы используете Mac, можете установить coreutils с помощью brew. И не забудьте добавить PATH = "/ usr / local / opt / coreutils / libexec / gnubin: $ PATH" к
Это работает для меня со встроенным Mac grep (2.5.1-FreeBSD). Но использовать альтернативный Grep из Homebrew, другой способ для запуска , brew install grepа затем просто использовать ggrep. Нет необходимости изменять PATH.
wonderlr
5
Как насчет этого, чего мне удалось добиться, частично благодаря этому посту.
Вы хотите найти несколько файлов, скажем, журналы с разными именами, но с шаблоном (например filename=logfile.DATE), внутри нескольких каталогов с шаблоном (например /logsapp1, /logsapp2). У каждого файла есть шаблон, который вы хотите получить (например "init time"), и вы хотите иметь "init time"каждый файл, но зная, к какому файлу он принадлежит.
grep --version
grep --version
это команда, используемая для определения версии grep? Если так, это не работает. Не удалось найти другую команду, чтобы узнать версию grep.grep 'pattern' *
Ответы:
Попробуйте этот маленький трюк, чтобы убедить себя
grep
в том, что он имеет дело с несколькими файлами, и отобразить имя файла:Чтобы также получить номер строки:
источник
/dev/null
этой команды?grep
указано несколько имен файлов, он будет автоматически отображать имена файлов перед совпадением, но не будет указывать имя файла в случае одного входного файла. Используя/dev/null
в качестве дополнительного входного файла,grep
«думает», что он имеет дело с несколькими файлами, но / dev / null, конечно, пуст, поэтому он не будет отображаться в списке совпадений ..-H
опция для grep не является частью POSIX, а используемая ОС - Solaris 10, где ни у стандартной, ни у POSIX-совместимой версии grep такой-H
опции нет.find . -name foo -exec grep pattern {} \;
при условии, чтоfoo
в вашем подкаталоге много файлов, названных по-find
прежнему , все равноgrep
предоставляется один файл для работы за раз./dev/null
Трюк , кажется, работает во всех Linux / OSX ароматы , которые я пробовал, так что престижность! Заметьте, я думаю, что-H
это чище, но, как упоминалось ниже, оно может не поддерживаться вашей версиейgrep
.Если у вас есть варианты
-H
и-n
доступны (man grep
это ваш друг):Параметры:
-H
это расширение GNU, но-n
это определяется POSIXисточник
-H
здесь не поддерживается.Трюк не нужен.
С номерами строк:
источник
grep
, поэтому я не знаю.brew install grep
а затем просто использоватьggrep
. Нет необходимости изменять PATH.Как насчет этого, чего мне удалось добиться, частично благодаря этому посту.
Вы хотите найти несколько файлов, скажем, журналы с разными именами, но с шаблоном (например
filename=logfile.DATE
), внутри нескольких каталогов с шаблоном (например/logsapp1, /logsapp2
). У каждого файла есть шаблон, который вы хотите получить (например"init time"
), и вы хотите иметь"init time"
каждый файл, но зная, к какому файлу он принадлежит.Тогда
outputfilename.txt
будет что-то вродеВ основном
Объяснение:
find
Команда будет искать имена файлов на основе шаблоназатем труба
xargs -I{}
перенаправитfind
вывод на{}
который будет входом для
grep ""pattern" {}
Тогда трюк, чтобы сделать
grep
отображение имен файлов\dev\null
и, наконец, записать вывод в файл с
tee outputfile.txt
Это работало для меня в
grep
версии 9.0.5, сборка 1989 года.источник
find ./path_pattern/to_files -type f -name "files*.log" -exec grep -Hn pattern {} \;
Это небольшая модификация предыдущего решения. Мой пример ищет перенаправление stderr в скриптах bash:
grep '2>' $(find . -name "*.bash")
источник
работал для меня, чтобы искать через все файлы .txt (введите собственное значение поиска, конечно).
источник