Eigenartiges Verhalten von Piping Grep/Head

Eigenartiges Verhalten von Piping Grep/Head

Ich helfe dem Netadmin hier mit einem Perl-Regex, die Bearbeitung einiger Snapshots aus unserem SAN zu automatisieren, und unsere Skripte machen Dinge wie diese:

varinit1=$(iscsiadm -m session | grep rbmsdata1 | head -n1 | perl -pe 's/^tcp: \[\d*\] \d*\.\d*\.\d*\.\d*:\d*,\d* (iqn\..*\..*\..*:.*-.*-.*-.*-(.*-.*-\d{4}-\d{2}-\d{2}-\d{2}:\d{2}:\d{2}\.\d*\.\d*))$/$1/')

varsnap1=$(iscsiadm -m session | grep rbmsdata1 | head -n1 | perl -pe 's/^tcp: \[\d*\] \d*\.\d*\.\d*\.\d*:\d*,\d* (iqn\..*\..*\..*:.*-.*-.*-.*-(.*-.*-\d{4}-\d{2}-\d{2}-\d{2}:\d{2}:\d{2}\.\d*\.\d*))$/$2/')

Die Signatur des Snapshots besteht aus zwei Teilen, einer in dem anderen verschachtelt, und wir verwenden die Erfassungsgruppen, um den Namen und einen Teil des Namens für verschiedene nachfolgende Befehle zu erfassen, die ausgeführt werden müssen. Ich weiß, dass derselbe Befehl immer wieder ausgeführt wird und der reguläre Ausdruck später bereinigt werden kann, aber im Grunde verwenden sie Perl, um eine Klammer und die andere auszugeben.

tcp: [32] 40.40.40.101:3260,1 iqn.2001-05.com.equallogic:4-52aed6-91c5ffa78-2f0d8ae18504fee1-r12prd-rbmsdata1-2012-06-29-16:07:40.108.1
tcp: [33] 40.40.40.101:3260,1 iqn.2001-05.com.equallogic:4-52aed6-91c5ffa78-2f0d8ae18504fee1-r12prd-rbmsdata1-2012-06-29-16:07:40.108.1

Ich möchte daraus das Ergebnis von icsiadm und grep extrahieren und Folgendes erhalten:

iqn.2001-05.com.equallogic:4-52aed6-91c5ffa78-2f0d8ae18504fee1-r12prd-rbmsdata1-2012-06-29-16:07:40.108.1

Und

r12prd-rbmsdata1-2012-06-29-16:07:40.108.1

Unser Problem besteht darin, dass die Weiterleitung zum Kopfbereich zum Abrufen der ersten Zeile manchmal wie folgt fehlschlägt:

head: cannot open '–n1' for reading: No such file or directory

Dies scheint natürlich darauf hinzudeuten, dass die Standardeingabe zum Header leer ist und daher nach einem Dateinamen gesucht wird.

Aber es gibt keinen Grund, warum es jemals leer sein sollte.

Wenn wir Dinge wie diese tun:

varinit1=$(iscsiadm -m session | grep rbmsdata1 | head -n1)
varsnap1=$(iscsiadm -m session | grep rbmsdata1 | head -n1)

Der zweite Versuch schlägt fehl und die zweite Variable ist leer.

Wenn wir sie jedoch umkehren, schlägt varsnap1 fehl:

varsnap1=$(iscsiadm -m session | grep rbmsdata1 | head -n1)
varinit1=$(iscsiadm -m session | grep rbmsdata1 | head -n1)

Es ist sehr eigenartig und wir können nicht herausfinden, was los ist. Der Befehl iscsiadm gibt bei jedem Durchlauf dasselbe zurück, wenn wir ihn von der Befehlszeile aus und nach dem Grepping ausführen.

Ist die Verrohrung durch irgendetwas durcheinander geraten?

Head-Version 5.97 auf RedHat Enterprise Linux

Antwort1

Ihre Frage enthält möglicherweise einen Fehler (langer UTF-8-Bindestrich statt des normalen):

$ head –n1
head: cannot open ‘–n1’ for reading: No such file or directory
$ head -n1 # ctrl-d
$ 

Ich gehe davon aus, dass das nur eine Browsersache war, da es nur ein einziges Mal so war. headwartet auf Eingaben, wenn sie sowieso benötigt werden. Versuchen Sie, es head -n1durch eines der folgenden zu ersetzen:

sed -n 1p
awk 'NR==1 {print}' # yay, no potential dash problems

Ok, es gibt noch viele andere Möglichkeiten, aber Sie können das Pipe-Element auch weglassen und grepdurch Hinzufügen des Parameters einfach angeben, dass nur die erste Übereinstimmung zurückgegeben werden soll -m 1. Oder Sie entfernen zwei Elemente und geben an, perldass nur mit der ersten übereinstimmenden Zeile verfahren werden soll.

verwandte Informationen