it-swarm.com.de

Wie man ein bestimmtes Word mit grep im Ubuntu-Terminal aus einer txt-Datei holt

Ich habe eine txt Datei. In dieser Datei möchte ich ein bestimmtes Wort filtern.

Beispiel:

$PILOT_FIRSTNAME $PILOT_LASTNAME. This is the final confirmation for this flight.

Ich möchte eine Ausgabe wie:

PILOT_FIRSTNAME

PILOT_LASTNAME

Was sind all die Wörter mit $, das Wort nur holen?

4
hikoo

Verwenden des PCRE-Modus (Perl-kompatibler regulärer Ausdruck) von grep:

$ grep -Po '\$\K\w*' yourfile
PILOT_FIRSTNAME
PILOT_LASTNAME
  • \$: Entspricht dem Literal $
  • \K: (Ignoriere es)
  • \w: Gefolgt von null oder mehr Wortzeichen

Wenn Sie das Literalzeichen $ Abgleichen und beibehalten möchten, benötigen Sie nicht den Modifikator \K. und in der Tat brauchen Sie PCRE überhaupt nicht, Sie können einfach verwenden

$ grep -o '\$\w*' yourfile
$PILOT_FIRSTNAME
$PILOT_LASTNAME

oder (vielleicht tragbarer)

grep -o '\$[_[:alnum:]]*' yourfile
$PILOT_FIRSTNAME
$PILOT_LASTNAME
5
steeldriver

Wenn Sie also Felder der Datei als Zeilenvorschub getrennt drucken möchten, wenn sie mit $ Beginnen, können Sie Folgendes tun:

awk '{for(i=1;i<=NF;i++){if($i~/^\$/){printf "%s\n",substr($i,2)}}}' file.txt

Erweiterte Form:

awk '{
    for (i=1;i<=NF;i++)
        { if($i~/^\$/)
                { printf "%s\n",substr($i,2) }
        }
     }' file.txt

Hier iterieren wir über die Felder (for (i=1;i<=NF;i++)), wenn das Feld mit $ (if($i~/^\$/)) beginnt, dann drucken wir es mit einer abschließenden Newline ab dem zweiten Zeichen ( printf "%s\n",substr($i,2)).


Wenn andererseits die Anzahl der Felder fest ist und nicht viele, dann ist sed auch eine praktikable Option, wenn hier zwei Felder angenommen werden:

sed -nr 's/^\$([^[:blank:]]+)[[:blank:]]+\$([^[:blank:]]+)$/\1\n\2/p' file.txt

Entsprechen Sie $ Am Anfang jedes durch Leerzeichen getrennten Felds, erfassen Sie das Feld (([^[:blank:]]+)) Und setzen Sie die Felder im Ersetzungsfeld als durch Zeilenvorschub getrennt (1\n\2).


Beispiel:

$ cat file.txt
$PILOT_FIRSTNAME $PILOT_LASTNAME
$FOO $BAR
PILOT_FOO PILOT_BAR

$ awk '{for(i=1;i<=NF;i++){if($i~/^\$/){printf "%s\n",substr($i,2)}}}' file.txt
PILOT_FIRSTNAME
PILOT_LASTNAME
FOO
BAR

$ sed -nr 's/^\$([^[:blank:]]+)[[:blank:]]+\$([^[:blank:]]+)$/\1\n\2/p' file.txt
PILOT_FIRSTNAME
PILOT_LASTNAME
FOO
BAR
5
heemayl