2015-04-02 2 views
0

Я использую ниже код для grep некоторой строку:Как извлечь имя файла после строки оглавления в UNIX

grep 'string' *.log | grep -v 'string1' 

Я получаю выход в конкретном файле. Мое требование - извлечь это имя файла для переменной. Как я могу сделать это эффективно?

+0

Не уверен, что вам нужно точно , но вы пробовали это? 'testfilename =" someFilename.txt "; echo "$ {testfilename%. *}' Это вернет строку 'someFilename' (без расширения). –

+0

Если в glob есть только один файл, grep не будет печатать имя файла. Типичные методы для обеспечения того, чтобы имя файла напечатаны 'grep -H' и' grep pattern file/dev/null' –

ответ

2

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

variable=$(command arg1 arg2) 

Это подходит для вашего конкретного случая, если вы уверены, что там будет только один файл, созданный конвейером grep. В этом случае вы захватить ее имя в переменную оболочки fname через:

fname=$(grep -lZ string *.log | xargs -0 grep -lv string1) 

Это безопасно для сложных имен файлов, так как, с помощью -Z и -0 вариантов, мы используем NUL-разделенные списки. Опция -l для grep полезна здесь, потому что она подавляет обычный вывод grep и просто печатает имена файлов.

Если может быть несколько ссылок файлов, а затем, если вы можете использовать продвинутую оболочку как bash, попробуйте:

grep -lZ string *.log | xargs -0 grep -lvZ string1 | while IFS= read -r -d $'\0' fname 
do 
    # Process file "$fname" 
done 

Это также безопасно для сложных имен файлов, так как, по всему трубопроводу, он использует NUL - разделенные списки.

Для оболочки POSIX read работает с вводом новой строки. Чтобы сделать вышеперечисленное безопасным для трудных имен файлов, используется опция -d, которая поддерживается bash, zsh и другими расширенными оболочками.

+0

Возможно, вам также следует указать, какая оболочка поддерживает эту функцию 'read'. –

+0

@ MichaelGrünewald Хорошо. Я добавил, что POSIX не поддерживает' read - d', но это 'bash' и' zsh' do (могут быть и другие оболочки, но я не знаком с ними). – John1024

0

используйте команду

базовое "Filepath" "FileExtension"

например: базовое /home/john/xyz.txt .txt

выход: хуг

Смежные вопросы