2010-03-09 26 views
20

Tôi có danh sách các tệp có chứa các mẫu cụ thể, nhưng các tệp đó đã được tarred. Bây giờ tôi muốn tìm kiếm mẫu trong tệp tar và để biết tệp nào chứa mẫu mà không giải nén tệp.Thực hiện thao tác grep trong các tệp tar mà không cần giải nén

Bất kỳ ý tưởng nào ...?

+0

thể trùng lặp của [Làm thế nào để grep cho một mô hình trong các tập tin trong kho lưu trữ tar mà không làm đầy lên không gian đĩa] (http://stackoverflow.com/questions/13041068/how-to-grep-for-a-pattern-in-the-files-in-tar-archive-without-filling-up-disk-sp) – tripleee

Trả lời

25

lệnh tar có công tắc -O để trích xuất tệp của bạn thành đầu ra tiêu chuẩn. Vì vậy, bạn có thể đường ống những đầu ra để grep/awk

tar xvf test.tar -O | awk '/pattern/{print}' 

tar xvf test.tar -O | grep "pattern" 

ví dụ như quay trở lại tên file một mẫu tìm được

tar tf myarchive.tar | while read -r FILE 
do 
    if tar xf test.tar $FILE -O | grep "pattern" ;then 
     echo "found pattern in : $FILE" 
    fi 
done 
+0

Thật không may là sẽ không cung cấp tên của các tệp phù hợp. – jkff

+0

một chút tập lệnh sẽ thực hiện. xem chỉnh sửa của tôi – ghostdog74

+1

Vì vậy, đặt tên của một trong các tệp được tarred lên tar sau khi tệp lưu trữ chỉ cung cấp nội dung của tệp đó! Tài liệu này ở đâu? Bạn có thể nói không? – abc

2

Cách dễ nhất có thể là sử dụng avfs. Tôi đã sử dụng điều này trước đây cho các nhiệm vụ như vậy.

Về cơ bản, cú pháp là:

avfsd ~/.avfs # Sets up a avfs virtual filesystem 
rgrep pattern ~/.avfs/path/to/file.tar#/ 

/path/to/file.tar là đường dẫn đến tập tin tar thực tế.

Trước khi chờ xử lý ~/.avfs/ (điểm gắn kết) và nối # cho phép avfs hiển thị tệp tar làm thư mục.

7

GNU tar--to-command. Với nó, bạn có thể có tar mỗi tệp từ kho lưu trữ vào lệnh đã cho. Đối với trường hợp bạn chỉ muốn các dòng khớp, lệnh đó có thể là một đơn giản grep. Để biết tên tập tin bạn cần để tận dụng lợi thế của tar thiết lập các biến nhất định trong môi trường của lệnh; ví dụ,

tar xaf thing.tar.xz --to-command="awk -e '/thing.to.match/ {print ENVIRON[\"TAR_FILENAME\"] \":\", \$0}'" 

Bởi vì tôi thấy mình sử dụng này thường xuyên, tôi có điều này:

#!/bin/sh 
set -eu 

if [ $# -lt 2 ]; then 
    echo "Usage: $(basename "$0") <pattern> <tarfile>" 
    exit 1 
fi 

if [ -t 1 ]; then 
    h="$(tput setf 4)" 
    m="$(tput setf 5)" 
    f="$(tput sgr0)" 
else 
    h="" 
    m="" 
    f="" 
fi 

tar xaf "$2" --to-command="awk -e '/$1/{gsub(\"$1\", \"$m&$f\"); print \"$h\" ENVIRON[\"TAR_FILENAME\"] \"$f:\", \$0}'" 
+0

awk của tôi không có' '' -e''', nhưng điều này là nếu không hoàn hảo. – GaryO

+1

Lệnh 'grep' hỗ trợ' --label = "$ TAR_FILENAME" '; không cần sử dụng 'awk'. –

Các vấn đề liên quan