Shell-Skript: Greifen Sie in der Mitte des Textes nach einer Zeichenfolge, manchmal am Anfang

9

Ich habe eine große Textdatei, in der ein Teil davon so aussieht (bearbeitete Werte):

JULIANA XXXX006060 LI1033322 THC BRL 730.00
XXXX006296 AA1004737 THC BRL 1,740.00
SANTOS JULIANA XXXX006668 AA1004786 THC BRL 8,150.00
SANTOS JULIANA CABINDA XXXX006697 AA1004777 THC BRL 2,325.00
SANTOS JULIANA XXXX006699 AA1004790 THC BRL 2,325.00
JULIANA BATA XXXX006141 CCC012946 THC BRL 1,460.00
JULIANA BATA XXXX006153 CCC013054 THC BRL 870.00
JULIANA XXXX006269 CCC013105 THC BRL 870.00
JULIANA XXXX006295 CCC013083 THC BRL 870.00
JULIANA BATA XXXX006305 CCC013043 THC BRL 1,460.00

Ich möchte immer (mit einem cutoder awkoder etwas anderem) die Zeichenfolge greifen , die mit beginnt XXXX00, aber sie befindet sich nie in derselben Feldnummer.

Wie kann ich das in einem Shell-Skript machen?

Vitor Gatti
quelle

Antworten:

12

Nur grepdafür:

grep -oE 'XXXX00[0-9]*' file
  • -o: Druckt nur das passende Teil.
  • -E: Aktiviert erweiterte reguläre Ausdrücke.
  • [0-9]*: Nach der zu durchsuchenden Zeichenfolge sollten nur Zahlen angezeigt werden.
Chaos
quelle
Beachten Sie, dass der Regex die -EOption nicht benötigt (obwohl dies keinen Schaden anrichtet).
Jonathan Leffler
6

Es scheint, dass Sie das 5. Feld von rechts wollen, also

awk '{print $(NF-4)}' file
Glenn Jackman
quelle
ja!
Mikeserv
3

Verwendung grepmit PCRE:

% grep -Po '(^|\s)\KXXXX00[^\s]*(?=(\s|$))' file.txt
XXXX006060
XXXX006296
XXXX006668
XXXX006697
XXXX006699
XXXX006141
XXXX006153
XXXX006269
XXXX006295
XXXX006305

-wIn diesem Fall können Sie mit (Wort) davonkommen. Beachten Sie, dass die Wortbestandteile wie folgt betrachtet werden [[:alnum:]_]:

% grep -wo 'XXXX00[^ ]*' file.txt
XXXX006060
XXXX006296
XXXX006668
XXXX006697
XXXX006699
XXXX006141
XXXX006153
XXXX006269
XXXX006295
XXXX006305
heemayl
quelle
2

Ein paar andere Möglichkeiten

Mit GNU awk

awk -vRS='[[:space:]]+' '/^X{4}0{2}/' file

Bei älteren Versionen von GNU awk, --re-intervalkönnte erforderlich sein, so

awk --re-interval -vRS='[[:space:]]+' '/^X{4}0{2}/' file

Mit trundgrep

<file tr -s '[:space:]' '[\n*]' | grep '^X\{4\}0\{2\}'
iruvar
quelle
1
sed 's/[^0]*  *\([^ ]*\).*/\1/' <in >out

Es sieht so aus, als ob die Feldzahlen unterschiedlich sind, weil Sie dort eine Liste von Personen haben und diese eine unterschiedliche Anzahl von Namen haben. aber wahrscheinlich hat keiner von ihnen einen Namen mit 0 darin, also schneiden Sie einfach bis zur ersten durch Leerzeichen getrennten Zeichenfolge mit einer darin vollständig weg, speichern Sie sie und schneiden Sie alles Folgende aus.

mikeserv
quelle