Comment extraire des données de la table html dans un script shell?
Je suis en train de créer un script BASH ce qui permet d'extraire les données à partir de la table HTML.
Ci-dessous l'exemple de la table à partir de là que j'ai besoin d'extraire des données:
<table border=1>
<tr>
<td><b>Component</b></td>
<td><b>Status</b></td>
<td><b>Time / Error</b></td>
</tr>
<tr><td>SAVE_DOCUMENT</td><td>OK</td><td>0.406 s</td></tr>
<tr><td>GET_DOCUMENT</td><td>OK</td><td>0.332 s</td></tr>
<tr><td>DVK_SEND</td><td>OK</td><td>0.001 s</td></tr>
<tr><td>DVK_RECEIVE</td><td>OK</td><td>0.001 s</td></tr>
<tr><td>GET_USER_INFO</td><td>OK</td><td>0.143 s</td></tr>
<tr><td>NOTIFICATIONS</td><td>OK</td><td>0.001 s</td></tr>
<tr><td>ERROR_LOG</td><td>OK</td><td>0.001 s</td></tr>
<tr><td>SUMMARY_STATUS</td><td>OK</td><td>0.888 s</td></tr>
</table>
Et je veux que le script BASH pour la sortie comme suit:
SAVE_DOCUMENT OK 0.475 s
GET_DOCUMENT OK 0.345 s
DVK_SEND OK 0.002 s
DVK_RECEIVE OK 0.001 s
GET_USER_INFO OK 4.465 s
NOTIFICATIONS OK 0.001 s
ERROR_LOG OK 0.002 s
SUMMARY_STATUS OK 5.294 s
Comment faire?
Pour l'instant j'ai essayé d'utiliser le sed, mais je ne sais pas comment l'utiliser assez bien. L'en-tête de la table(Composant, le Statut, le Temps (ou l'Erreur) j'exclus avec grep à l'aide de grep "<tr><td>
de sorte que seules les lignes qui commencent avec <tr><td>
sera choisi pour la prochaine analyse (sed).
C'est ce que j'ai utilisé: sed 's@<\([^<>][^<>]*\)>\([^<>]*\)</\1>@\2@g'
Mais alors <tr>
balises restent encore et aussi il l'habitude de séparer les chaînes. En d'autres termes, le résultat de ce script est:
<tr>SAVE_DOCUMENTOK0.406 s</tr>
L'intégralité de la commande du script que je suis en train de travailler sur est:
cat $FILENAME | grep "<tr><td>" | sed 's@<\([^<>][^<>]*\)>\([^<>]*\)</>@@g'
source d'informationauteur Marko
Vous devez vous connecter pour publier un commentaire.
Aller avec
(g)awk
il est capable :-), voici une solution, mais veuillez noter: c'est seulement en travaillant avec l'exacte html format de tableau que vous aviez posté.Ici vous pouvez le voir en action: https://ideone.com/zGfLe
Quelques explications:
-F
définit le champ d'entrée du séparateur à une regexp (tout detr
's outd
'ouverture ou de la fermeture de la balisepuis fonctionne uniquement sur les lignes qui correspond à ces balises ET au moins deux upercasse champs
imprime ensuite les champs nécessaires.
HTH
Vous pouvez utiliser bash
xpath
(XML::XPath module perl) pour accomplir cette tâche très facilement:Vous pouvez utiliser
html2text
de commande et de formater les colonnes viacolumn
par exemple:avant de l'analyser loin de là (par exemple
cut
awk
ex
).Dans le cas où vous souhaitez trier tout d'abord, vous pouvez utiliser
ex
voir l'exemple ici ou ici.Il y a beaucoup de façons de le faire, mais en voici un:
Vous pouvez utiliser plus sed(1) (
-e 's:^ ::'
) au lieu de lacut -c2-
à retirer le premier espace, mais de coupe(1) ne pas obtenir autant d'amour qu'il mérite. Et les barres obliques inverses sont juste là pour la mise en forme, vous pouvez les enlever pour obtenir un revêtement ou de les laisser dans et assurez-vous qu'ils sont immédiatement suivis par un saut de ligne.La stratégie de base consiste à tirer lentement le HTML en dehors pièce par pièce, plutôt que d'essayer de tout faire à la fois avec un seul incompréhensible tas de syntaxe regex.
Parsing HTML avec un oléoduc de shell n'est pas la meilleure idée jamais, mais vous pouvez le faire si le code HTML est connu de venir dans un modèle très précis. Si il y aura des différences, alors que vous seriez mieux avec un vrai analyseur HTML, Perl, Ruby, Python, ou encore C.
Une solution à base de multi-plate-forme web de grattage de la CLI
xidel
et XQuery:Avec l'échantillon d'entrée, cela donne:
Explication:
Requête XQuery
for $tr in //tr[position()>1] return join($tr/td, " ")
processus de latr
éléments à partir de la 2e (position()>1
pour passer la ligne d'en-tête) dans une boucle, et rejoint les valeurs de l'enfanttd
éléments ($tr/td
) avec un espace comme séparateur.-s
faitxidel
silencieux (supprime la sortie de statut de l'information).Tout
html2text
est pratique pour affichage des données extraites, fournir analysable automatiquement la sortie est non-trivialmalheureusement:Le Awk commande supprime le caché
\b
(retour arrière) des séquences quehtml2text
sorties par défaut, et analyse les lignes dans les champs par|
et puis les sorties avec un espace comme séparateur (un espace est Awk de sortie par défaut, le séparateur de champ; pour le modifier sur un onglet, par exemple, l'utilisation-v OFS='\t'
).Remarque: l'Utilisation de
-nobs
la touche retour arrière pour supprimer les séquences à la source est pas une option, parce que vous ne serez pas en mesure de distinguer entre le caché par défaut_
instances utilisées pour le rembourrage et réelle_
caractères dans les données.Remarque: étant Donné que
html2text
apparemment invariablement utilise|
que le séparateur de colonnes, le ci-dessus ne fonctionnera que robuste si le sont pas|
cas dans le données extrait.Vous pouvez convertir le fichier en utilisant Ex-rédacteur (partie de Vim) par la suppression des balises HTML, par exemple:
Ici est une version raccourcie par l'impression de l'ensemble du fichier sans les balises HTML:
Explication:
%s/<[^>]\+>//g
- Substitute toutes les balises HTML dans un espace vide.v/0/d
- Deletes toutes les lignes sans0
.wq! /dev/stdout
- Quits de l'éditeur et writes de la mémoire tampon à la sortie standard.