我使用下面的代码grep
一些字符串:
grep 'string' *.log | grep -v 'string1'
我在特定文件中获取输出。我的要求是将该文件名提取到变量中。我怎么能有效地做到这一点?
答案 0 :(得分:2)
通常,您可以通过命令替换将任何命令的输出捕获到shell变量中:
variable=$(command arg1 arg2)
如果您确定grep
管道只生成一个文件名,则这适用于您的特定情况。在这种情况下,您可以通过以下方式将其名称捕获到shell变量fname
中
fname=$(grep -lZ string *.log | xargs -0 grep -lv string1)
这对于困难的文件名是安全的,因为通过-Z
和-0
选项,我们使用NUL分隔的列表。 -l
的{{1}}选项在这里很有用,因为它会抑制正常的grep
输出,只打印文件名。
如果可能有多个文件匹配,那么,如果您可以使用grep
之类的高级shell,请尝试:
bash
这对于困难的文件名也是安全的,因为在整个管道中,它使用NUL分隔的列表。
对于POSIX shell,grep -lZ string *.log | xargs -0 grep -lvZ string1 | while IFS= read -r -d $'\0' fname
do
# Process file "$fname"
done
使用换行符分隔的输入。为了使上述文件名更加安全,我们使用了read
,-d
和其他高级shell支持的bash
选项。
答案 1 :(得分:0)
使用命令
basename“filePath”“fileExtension”
ex:basename /home/john/xyz.txt .txt
输出:xyz