J'ai un petit problème ici, j'ai besoin de pouvoirlire un fichier de taille inconnue, il peut s'agir de quelques centaines de lignes ou de plusieurs autres. Les fichiers journaux changent tout le temps et en fonction du moment où je vérifie. Je voudrais avoir une méthode qui est en PHP ou en Linux que je peux lire une plage de lignes à partir d'un fichier. Je ne veux pas avoir à lire l'intégralité du fichier dans la mémoire php, puis supprimer les lignes, car le fichier peut être plus volumineux que la mémoire autorisée de php.
Je veux aussi qu'il utilise des modules php par défaut ou que les outils linux par défaut ne veuillent pas avoir besoin d'installer quoi que ce soit car ils doivent être portables.
Modifier:
Pour les options basées sur Linux, j'aimerais êtrecapable de fournir plus d'une gamme, il se peut que je doive obtenir quelques gammes de lignes différentes, je sais comment le faire en php, mais pas sous linux et pour éviter de lire les lignes précédentes que j'ai déjà lues?
Réponses:
4 pour la réponse № 1Avec awk:
awk "NR>=10 && NR<=15" FILE
Avec awk (deux gammes):
awk "NR>=10 && NR<=15 || NR>=26 && NR<=28" FILE
Avec ed
:
echo 2,5p | ed -s FILE
Avec ed
et deux gammes:
echo -e "2,5pn7,8p" | ed -s FILE
Last but not least, un sed
solution à deux gammes (solution la plus rapide, testée avec time
):
sed -n "2,5p;7,8p" FILE
1 pour la réponse № 2
Qu'en est-il quelque chose comme
head -100 | tail -15
vous donne les lignes 86-100
0 pour la réponse № 3
$ cat input.txt
q
w
e
r
t
y
u
i
$ sed -n 2,5p input.txt
w
e
r
t
0 pour la réponse № 4
while ($lines_read < last_line_desired) {
while ($line = fgets($filehandle, $buffersize) !== false)
if (line >= first_desired_line) {
push($interesting_lines, $line)
}
}
$lines_read++
}
Ouvrir le descripteur de fichier, en choisissant la taille de mémoire tampon suffisamment grande pour couvrir toute longueur de ligne attendue, etc., vous appartient.
Si vous lisez des fichiers qui sont régulièrement ajoutés, vous devriez vous pencher sur la marcher et fseek fonctions pour noter où vous vous trouvez dans vos données et ignorer tous les anciens éléments avant de continuer à lire.