В общем, вы можете захватить выход любой команды в переменную оболочки с помощью подстановки команд как это:
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
и другими расширенными оболочками.
Не уверен, что вам нужно точно , но вы пробовали это? 'testfilename =" someFilename.txt "; echo "$ {testfilename%. *}' Это вернет строку 'someFilename' (без расширения). –
Если в glob есть только один файл, grep не будет печатать имя файла. Типичные методы для обеспечения того, чтобы имя файла напечатаны 'grep -H' и' grep pattern file/dev/null' –