awk + print line nur, wenn das erste Feld mit string als Linux1 beginnt

16

Wie wird die Zeile gedruckt, wenn das erste Feld mit Linux1 beginnt?

beispielsweise:

  echo Linux1_ver2  12542 kernel-update  |   awk '{if ($1 ~ Linux1 ) print $0;}'

Das Ziel ist es, die Zeile zu drucken, während das erste Feld mit Linux1 beginnt

Beispiel für Linien:

Linux1-new  36352 Version:true
Linux1-1625543  9847
Linux1:16254 8467563 

Das Bemerkungsfeld oder die Tabulatortaste könnte vor der ersten Ablage stehen

yael
quelle

Antworten:

15

Einweg:

echo "Linux1_ver2  12542 kernel-update"  |  awk '$1 ~ /^ *Linux1/'
Guru
quelle
$ 1 und ^ sind redundant. Ihr Vorschlag deckt keine Registerkarten ab.
Hauke ​​Laging
@ HuakeLaging Warum denkst du, sind die $ 1 und ^ überflüssig? Ich bin mir ziemlich sicher, dass beides erforderlich ist, damit nur das erste Wort verglichen wird und damit die Übereinstimmung am Anfang verankert ist (z. B. könnte "mLinux" von / Linux1 /, aber nicht von / ^ Linux / abgeglichen werden).
Nick Bull
19

awk ignoriert führende Leerzeichen bei der Zuweisung von Feldern. Der Standardbefehl lautet "Drucken".

awk '$1 ~ /^Linux1/'

Ist was du willst.

Ausführliche Erklärung:

  • $ 1 weist awk an, sich die erste "Spalte" anzuschauen.
  • ~ weist awk an, ein RegularExpression-Match durchzuführen. /..../ ist ein regulärer Ausdruck.
  • In der RE steht der String Linux und das Sonderzeichen ^.
  • ^ bewirkt, dass die RE von Anfang an übereinstimmt (im Gegensatz zur Übereinstimmung an einer beliebigen Stelle in der Zeile).

Zusammen gesehen: Awk wird am Anfang der ersten Spalte einen regulären Ausdruck mit "Linux" abgleichen.

Johan
quelle
2

Dies sollte für diesen speziellen Fall funktionieren.

awk '/^[[:blank:]]*Linux1/ {print}'
Bernhard
quelle
aber wenn der Speicherplatz vor Linux1 ist, wird es keine Übereinstimmung geben
yael
@yael Ich habe eine Änderung vorgenommen, um das zu korrigieren.
Hauke ​​Laging
+1 Für alle, die sich fragen, was diese Syntax bewirkt: "Mach die Dinge in geschweiften Klammern nur, wenn der reguläre Ausdruck mit dieser Zeile übereinstimmt".
user541686