2015-04-02 43 views
0

grepping字符串我使用下面的代碼grep一些字符串後如何解壓文件名:在特定的文件在UNIX

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

我得到的輸出。我的要求是將該文件名提取到一個變量。我如何有效地做到這一點?

+0

不知道你到底需要,但你試過這個嗎? 'testfilename =「someFilename.txt」; echo「$ {testfilename%。*}' 這將返回字符串'someFilename'(沒有擴展名) – 2015-04-02 06:30:28

+0

如果glob中只有一個文件,grep將不會打印文件名。打印是'grep -H'和'grep模式文件/ dev/null' – 2015-04-02 12:11:51

回答

2

在一般情況下,你可以通過命令替換捕捉任何命令的輸出到一個shell變量是這樣的:

variable=$(command arg1 arg2) 

此,如果你確信會有適合您的具體情況只有一個管道生成的grep文件名。在這種情況下,你捕捉它的名字到shell變量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 shell,read使用換行符分隔輸入。爲了使上面的文件名難以安全,使用-d選項,該選項由bash,zsh和其他高級shell支持。

+0

也許你應該告訴哪個shell支持'read'功能 – 2015-04-02 06:47:49

+0

@MichaelGrünewald好點,我提到POSIX不支持'read- d',但'bash'和'zsh'(可能還有其他的shell,但我不熟悉它們)。 – John1024 2015-04-02 06:57:56

0

使用命令

名前綴 「文件路徑」, 「fileExtension」

例如:基名/home/john/xyz.txt .TXT

輸出:XYZ