Quelle est la meilleure façon d'obtenir uniquement la correspondance finale d'une expression régulière dans un fichier à l'aide de grep?
De plus, est-il possible de commencer la grepping à partir de la fin du fichier au lieu du début et de s'arrêter lorsqu'il trouve la première correspondance?
Tu pourrais essayer
grep pattern file | tail -1
ou
tac file | grep pattern | head -1
ou
tac file | grep -m1 pattern
J'utilise toujours cat (mais cela fait un peu plus long): cat file | grep pattern | tail -1
Je blâmerais mon professeur de cours d'administration Linux au collège qui aime les chats :))))
- Vous n'avez pas à attraper un fichier avant de le saluer. grep pattern file | tail -1
et est également plus efficace.
Pour quelqu'un qui travaille avec d'énormes fichiers texte sous Unix/Linux/Mac/Cygwin. Si vous utilisez Windows, vérifiez ceci sur les outils Linux dans Windows: https://stackoverflow.com/questions/3519738/what-is-the-best-way-to-use-linux-utilities-under-windows .
On peut suivre ce workflow pour avoir de bonnes performances:
zq
dans le package.Citation de son readme github:
Création d'un index
zindex doit savoir quelle partie de chaque ligne constitue l'index. Cela peut être fait par une expression régulière, par champ ou en canalisant chaque ligne via un programme externe.
Par défaut, zindex crée un index de file.gz.zindex lorsqu'on lui demande d'indexer file.gz.
Exemple:
créer un index sur les lignes correspondant à une expression régulière numérique. Le groupe de capture indique la partie à indexer et les options indiquent que chaque ligne a un index numérique unique.
$ zindex file.gz --regex 'id:([0-9]+)' --numeric --unique
Exemple: créez un index sur le deuxième champ d'un fichier CSV:
$ zindex file.gz --delimiter , --field 2
Exemple:
créer un index sur un champ JSON orderId.id dans l'un des éléments du tableau d'actions de la racine du document (nécessite jq). La requête jq crée un tableau de tous les orderId.ids, puis les joint à un espace pour garantir que chaque ligne individuelle dirigée vers jq crée une seule ligne de sortie, avec plusieurs correspondances séparées par des espaces (qui est le séparateur par défaut).
$ zindex file.gz --pipe "jq --raw-output --unbuffered '[.actions[].orderId.id] | join(\" \")'"
Interrogation de l'index
Le programme zq est utilisé pour interroger un index. Il reçoit le nom du fichier compressé et une liste de requêtes. Par exemple:
$ zq file.gz 1023 4443 554
Il est également possible de sortir par numéro de ligne, donc d'imprimer les lignes 1 et 1000 à partir d'un fichier:
$ zq file.gz --line 1 1000