如何在unix中搜索字符串后提取文件名

时间:2015-04-02 06:23:31

标签: shell unix grep

我使用下面的代码grep一些字符​​串:

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

我在特定文件中获取输出。我的要求是将该文件名提取到变量中。我怎么能有效地做到这一点?

2 个答案:

答案 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