2015-04-17 127 views
0

我想知道如何顯示文件名以及與tar文件的specfic字匹配的行。顯示文件名的tar文件

指揮英明:

zcat file | grep "stuff" -r # shows what I want 
zcat *.gz | grep "stuff" -ar # this fails 
+0

歡迎來到SO!請考慮使用'{}'按鈕來設置您的代碼的格式,以提高可讀性。 –

+1

退房http://stackoverflow.com/questions/13983365/grep-from-tar-gz-without-extracting-faster-one –

+0

那個按鈕是在編輯器中,請不要'{'和'}': - )您可以在每行之前放置4個空格。 –

回答

0

您可以使用zgrep

對於單個文件,您可以使用下面的命令來顯示文件名:

zgrep "stuff" file.gz /dev/null 

對於多個文件:

+0

它看起來像OP有tgz。而'zgrep'做得很好,裏面gzip文件grepping,我不認爲它會很好地工作在文件grepping用gzip壓縮包內_and_打印他們的名字。 –

+0

他的例子顯示'* .gz' – Amit

+0

是的,我知道,但OP也寫了「tar文件」。也許我錯了,他們的意思是「gz文件」。 –

0

我不太清楚問題是什麼,但是如果你在你的系統上尋找tar文件,那就幹這樣的事情吧。這將遞歸搜索當前目錄和任何子目錄中的.tar文件。希望這可以幫助。

find -name "*.tar" 
+0

不,它不會 - 你的意思是'發現'? OP不想查找tar文件,但grep查找文件_in a_ tar文件中的表達式。 –

+0

哎呀,是我沒有 我的意思是: 找到-name「*的.tar」 – blakepeterman

+0

現在說法是正確的,編輯的感謝。我只是害怕你的帖子還沒有真正回答這個問題:-) –

0

也許這個related answer可以提供幫助。它使用tar來解壓縮(您需要添加-z),並將壓縮文件的每個文件分配給awk以在其中進行「刷新」。

0

如果​​顯示你想要什麼,你可以爲多個文件做到這一點:

for name in *.gz ; do zcat "$name" | grep -a "stuff" | sed -e "s/^/${name}: /" ; done 

此命令使用通配符(*)擴大到在你的工作目錄.gz文件的列表,然後調用zcat爲提取,grep爲搜索和sed前綴與每個文件的文件名。

請注意,如果您正在使用gzipped壓縮包,大多數人會給他們一個.tgz.tar.gz而不僅僅是.gz擴展名。

0

這將輸出nameOfFileInTar:LineNumber:Match。用greptar.sh tarfile.tar pattern

調用如果您不想要行號,請刪除-n選項。如果您只想要行號,請在grep後加|cut -f1 -d:

#!/bin/bash 

TARFILE=$1 
PATTERN=$2 
tar ztf $TARFILE | while read -r FILE 
do 
    res=$(tar zxf $TARFILE $FILE -O | grep -n $2) 
    if [[ $? == 0 ]]; then 
     echo "$res" | while read -r line; do 
     echo $FILE:$line; 
     done 
    fi 
done