GNU tar
có --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}'"
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