L'essentiel de la façon d'accomplir cela est d'obtenir les noms des fichiers dans l'archive à rechercher, et d'extraire leur contenu à rechercher, sans rien extraire d'autre. Parce que nous ne voulons pas écrire dans le système de fichiers, nous pouvons utiliser l'indicateur -O
pour extraire à la sortie standard.
tar -tzf file.tar.gz | grep '\.txt' | xargs tar -Oxzf file.tar.gz | grep -B 3 "string-or-regex"
concaténera tous les fichiers dans le fichier .tar.gz avec des noms se terminant par ".txt", et grep
eux pour la chaîne donnée, en émettant également les 3 lignes précédentes. Il ne vous dira pas quel fichier provient de l'archive, et les "trois lignes précédentes" peuvent en fait provenir du fichier précédent.
Vous pouvez faire à la place:
for file in $(tar -tzf file.tar.gz | grep '\.txt'); do
tar -Oxzf file.tar.gz "$file" | grep -B 3 --label="$file" -H "string-or-regex"
done
qui respectent les limites des fichiers et rapporter les noms de fichiers, mais être beaucoup moins efficace.
(-z
dit tar
il est gzip
compressé. -t
répertorie le contenu. -x
extraits. -O
réoriente la sortie standard plutôt que le système de fichiers. Anciens tar
s ne peuvent pas avoir le drapeau -O
ou -z
et veulent les drapeaux sans -
: par exemple tar tz file.tar.gz
)
Bon, vous avez donc un grep inutilisable. Nous pouvons résoudre cela avec awk!
#!/usr/bin/awk -f
BEGIN { context=3; }
{ add_buffer($0) }
/pattern/ { print_buffer() }
function add_buffer(line)
{
buffer[NR % context]=line
}
function print_buffer()
{
for(i = max(1, NR-context+1); i <= NR; i++) {
print buffer[i % context]
}
}
function max(a,b)
{
if (a > b) { return a } else { return b }
}
Ce ne sera pas s'unir matchs adjacents, contrairement grep -B, et peut ainsi répéter les lignes qui sont dans les 3 lignes de deux matches différents.
Est-il possible de retitrer ceci pour qu'il soit clair qu'il s'agit d'un .tar.gz. Voulez-vous les trois lignes précédentes dans un seul fichier, ou est-ce correct si cela signale une ligne d'un fichier précédent? – wnoise
trois lignes précédentes à partir d'un fichier/même fichier – CFUser
Fichiers Zip! = Tar-balls. Veuillez corriger le libellé. –