Vraag De laatste overeenkomst in een bestand ophalen met grep


Wat is de beste manier om alleen de laatste overeenkomst van een reguliere expressie in een bestand te krijgen met grep?

Is het ook mogelijk om te beginnen met grepping vanaf het einde van het bestand in plaats van het begin en het einde wanneer het de eerste match vindt?


43
2017-11-01 23:26


oorsprong




antwoorden:


Je kan het proberen

grep pattern file | tail -1

of

tac file | grep pattern | head -1

of

tac file | grep -m1 pattern

66
2017-11-01 23:33



tac file | grep -m 1 pattern - Dennis Williamson
Met de extra beperking dat ik het regelnummer wilde krijgen (grep -n) in het eigenlijke bestand, denk ik tac vrijwel moest worden vermeden, tenzij ik wat aftrek wilde doen wc -l. Anders tac met grep -m1 maakt veel zin. - Nick Merrill
Ik zou graag een meer performante versie dan deze zien, omdat ik probeer een bestand van 20 GB te doorzoeken. - Jeff
@DennisWilliamson's antwoord is veel beter omdat grep stopt met werken na de eerste wedstrijd. zonder -m 1, grep zal eerst vind alle overeenkomende patronen in het bestand, dan head zal alleen de eerste tonen - veel minder efficiënt. Dennis, overweeg dit in een apart antwoord te plaatsen! - gilad mayani


Ik gebruik altijd katten (maar dit maakt het iets langer): cat file | grep pattern | tail -1

Ik zou mijn linux admin-cursusleraar op school de schuld geven van katten :))))

- Je hoeft niet eerst een bestand te catken voordat je het vult. grep pattern file | tail -1 en is ook efficiënter.


1
2017-11-02 01:45



Dit is slechts het eerste deel van het antwoord van Cakemox, behalve erger. - augurar


Voor iemand die werkt met enorme tekstbestanden in Unix / Linux / Mac / Cygwin. Als u Windows gebruikt, kijk dan eens naar Linux-hulpmiddelen in Windows: https://stackoverflow.com/questions/3519738/what-is-the-best-way-to-use-linux-utilities-under-windows.

Men kan deze workflow volgen om goede prestaties te hebben:

  1. comprimeren met gzip
  2. gebruik zindex (op github:      https://github.com/mattgodbolt/zindex) om het bestand te indexeren met     juiste sleutel
  3. vraag het geïndexeerde bestand met zq uit het pakket.

Citaat uit zijn github readme:

Een index maken

zindex moet worden verteld welk deel van elke regel de index is.   Dit kan gedaan worden door een reguliere expressie, door een veld, of door elk een piping   regel door een extern programma.

Standaard maakt zindex een index van file.gz.zindex wanneer daarom wordt gevraagd   index file.gz.

Voorbeeld:

maak een index op lijnen die overeenkomen met een gewone numeriek   uitdrukking. De vastleggingsgroep geeft het gedeelte aan dat moet worden geïndexeerd,   en de opties tonen dat elke regel een unieke, numerieke index heeft.

$ zindex file.gz --regex 'id:([0-9]+)' --numeric --unique

Voorbeeld:   maak een index op het tweede veld van een CSV-bestand:

$ zindex file.gz --delimiter , --field 2 

Voorbeeld:

maak een index op a   JSON-veld orderId.id in een van de items in de hoofdmap van het document   reeks acties (vereist jq). De jq-query maakt een array van alle   orderId.ids, voegt ze vervolgens samen met een spatie om elk individu te verzekeren   lijn doorgesluisd naar jq creëert een enkele regel van uitvoer, met meerdere   overeenkomsten gescheiden door spaties (dit is het standaardscheidingsteken).

$ zindex file.gz --pipe "jq --raw-output --unbuffered '[.actions[].orderId.id] | join(\" \")'" 

De index opvragen

Het zq-programma wordt gebruikt om een ​​index op te vragen. Het heeft de naam van de gegeven   gecomprimeerd bestand en een lijst met query's. Bijvoorbeeld:

$ zq file.gz 1023 4443 554 

Het is ook mogelijk om output per regel   nummer, dus om regels 1 en 1000 uit een bestand af te drukken:

$ zq file.gz --line 1 1000

0
2017-10-03 07:39