Gibt es eine Möglichkeit, mit dem Befehl cut ein Feldtrennzeichen für mehr Leerzeichen anzugeben? (wie "" +)? Zum Beispiel: In der folgenden Zeichenfolge möchte ich den Wert '3744' erreichen. Welches Feldtrennzeichen sollte ich sagen?
$ps axu | grep jboss
jboss 2574 0.0 0.0 3744 1092 ? S Aug17 0:00 /bin/sh /usr/java/jboss/bin/run.sh -c example.com -b 0.0.0.0
cut -d' '
ist nicht das, was ich will, denn es ist nur für einen einzigen Raum.
awk
ist nicht das, wonach ich suche, sondern wie man mit "schneiden" umgeht?
Vielen Dank.
tr
wie hier gezeigt: stackoverflow.com/a/4483833/168143ps
+ könnengrep
Siepgrep
die in den meisten modernen Distributionen verfügbare verwenden. Das Ergebnis wird genau in der Form zurückgegeben, in der Sie es benötigen.Antworten:
Eigentlich
awk
ist genau das Werkzeug, das Sie sich ansehen sollten:oder Sie können das
grep
ganz weglassen, da Sieawk
über reguläre Ausdrücke Bescheid wissen:Aber wenn Sie aus irgendeinem bizarren Grund wirklich nicht verwenden können
awk
, gibt es andere einfachere Dinge, die Sie tun können, z. B. zuerst alle Leerzeichen auf ein einziges Leerzeichen zu reduzieren:Dieser
grep
Trick ist übrigens ein guter Weg, um nur diejboss
Prozesse zu erhalten und nicht dengrep jboss
einen (ebenso für dieawk
Variante).Der
grep
Prozess enthält ein Literalgrep [j]boss
in seinem Prozessbefehl, sodass er nicht von sichgrep
selbst erfasst wird , das nach der Zeichenklasse sucht,[j]
gefolgt vonboss
.Dies ist ein geschickter Weg, um das
| grep xyz | grep -v grep
Paradigma zu vermeiden, das manche Menschen verwenden.quelle
grep
Trick scheint in Crontab-Dateien nicht zu funktionieren. Irgendein Grund?awk
Version ist wahrscheinlich der beste Weg, aber Sie können auch verwendencut
wenn Sie zuerst die Wiederholungen drücken mittr
:quelle
tr -s ' '
ist mächtig schön! Ich hoffe, ich kann mich besser daran erinnern alsawk
Ich benutze dafür gerne den Befehl tr -s
Dadurch werden alle Leerzeichen auf 1 Leerzeichen reduziert. Auf diese Weise wird die Anweisung, cut, ein Leerzeichen als Trennzeichen zu verwenden, wie erwartet berücksichtigt.
quelle
Ich werde nominieren
tr -s [:blank:]
als beste Antwort nominieren.Warum wollen wir cut verwenden? Es hat den magischen Befehl, der besagt: "Wir wollen das dritte Feld und jedes Feld danach, wobei die ersten beiden Felder weggelassen werden."
Ich glaube nicht, dass es einen äquivalenten Befehl für awk oder perl split gibt, bei dem wir nicht wissen, wie viele Felder es geben wird, dh das 3. Feld durch Feld X setzen.
quelle
Kürzere / einfachere Lösung: verwenden
cuts
(auf Steroiden schneiden, die ich geschrieben habe)Beachten Sie, dass
cuts
Feldindizes auf Null basieren, sodass das fünfte Feld als 4 angegeben wirdhttp://arielf.github.io/cuts/
Und noch kürzer (ohne Schnitt) ist:
quelle
Ein Weg, um dies zu umgehen, ist zu gehen:
um mehrere aufeinanderfolgende Leerzeichen durch ein einziges zu ersetzen.
quelle
\s
ist eine GNU sed Erweiterung. Unter OS X können Sie das-E
Flag an sed übergeben, um erweiterte reguläre Ausdrücke zu aktivieren, und dann[[:space:]]
anstelle der folgenden verwenden\s
:sed -E 's/[[:space:]]+/ /g'
Persönlich neige ich dazu, awk für solche Jobs zu verwenden. Beispielsweise:
quelle
ps axu | awk '/[j]boss/ {print $5}'
.Alternativ gibt es immer Perl:
Oder wenn Sie alle Felder ab Feld 3 erhalten möchten (wie in einer der obigen Antworten angegeben):
quelle
lsof
Ich habe versucht,lsof|perl -lane 'print $F[5]'
dies bekommt manchmal die 5. Spalte, manchmal die 6.Wenn Sie Spalten aus einer ps-Ausgabe auswählen möchten, gibt es einen Grund, -o nicht zu verwenden?
z.B
Minimale Spaltenbreite zugewiesen, kein Auffüllen, nur einzelnes Feldtrennzeichen.
Pid und vsz erhalten 10 Zeichen Breite, 1 Leerzeichen Feldtrennzeichen.
In einem Skript verwendet: -
quelle
Ein anderer Weg, wenn Sie den Befehl cut verwenden müssen
Ersetzen Sie in Solaris awk durch
nawk
oder/usr/xpg4/bin/awk
quelle
Ich mag immer noch die Art und Weise, wie Perl mit Feldern mit Leerzeichen umgeht.
Das erste Feld ist $ F [0].
quelle
Mein Ansatz ist es, die PID in einer Datei in / tmp zu speichern und mit der
-S
Option für den richtigen Prozess zu findenssh
. Das könnte ein Missbrauch sein, funktioniert aber für mich.Ein besserer Ansatz könnte darin bestehen, nach dem
SSH_PID
Recht zu fragen, bevor es beendet wird, da die Datei möglicherweise veraltet ist und einen falschen Prozess beendet.quelle