web-dev-qa-db-fra.com

Obtention de la dernière correspondance dans un fichier à l'aide de grep

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?

63
Acorn

Tu pourrais essayer

grep pattern file | tail -1

ou

tac file | grep pattern | head -1

ou

tac file | grep -m1 pattern
95
Cakemox

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.

1
Ismail Guneydas

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:

  1. compresser avec gzip
  2. utilisez zindex (sur github: https://github.com/mattgodbolt/zindex ) pour indexer le fichier avec la clé appropriée
  3. interroger le fichier indexé avec 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
1
biocyberman