So erhalten Sie einen Teilstring aus dem Befehl bash

8

Angesichts der folgenden Teilzeichenfolge, die mit dem Befehl erhalten wurde df /dev/sdb1 | tail -n 1:

/dev/sdb1 1952971772 1441131032 511840740 74% /media/kaiman/ShareData

Ich möchte aus dieser Zeichenfolge extrahieren 1952971772und 74%sie in einem Bash-Skript verwenden.

Ich weiß, dass ich einige Schnittbefehle oder ähnliches verwenden könnte, aber es funktioniert nicht mehr, wenn sich beispielsweise die Größe ändert.

Ich hatte auch Gedanken über die Verwendung eines regulären Ausdrucks oder so, aber ich hätte gerne den am meisten empfohlenen Ansatz.

Danke im Voraus!

Nicolas DUVOISIN
quelle
2
Fragen Sie nach dem allgemeinen Fall oder nach dem dfBesonderen? In letzterem df --output=pcent /dev/sdb1
Fall
2
Sie verwenden die cutZeichenposition in der Zeile, wodurch sie fehlschlägt, wenn sich die Zeilenlänge mit Schwankungen der Dateigröße ändert. Ich glaube, Sie können festlegen cut, dass Spalte 2und Spalte 5durch Leerzeichen abgegrenzt werden sollen, aber ich telefoniere und kann keine Antwort recherchieren und effektiv veröffentlichen.
WinEunuuchs2Unix
1
@ WinEunuuchs2Unix Die Anzahl der Leerzeichen kann variieren, daher ist es schwer zu sagen, welche Spaltennummer korrekt ist. cutNach jedem Trennzeichen wird eine Spalte angezeigt.
Mook765
Zwei oder mehr zusammenhängende Leerzeichen zählen immer noch als ein Leerzeichen für die Abgrenzung von Spalten, glaube ich
WinEunuuchs2Unix
@ WinEunuuchs2Unix richtig :) Ich die Befehle aus einer Textdatei, die ich zur Hand habe: D
Rinzwind

Antworten:

6
$ df /dev/sdb1 | awk '{ print $5 }' | tail -n 1

für den Prozentsatz und

$ df /dev/sdb1 | awk '{ print $2 }' | tail -n 1

für die Größe.

Ohne die tail:

df /home | awk 'NR==2 { print $2 }'
df /home | awk 'NR==2 { print $5 }'

  • awk '{ print $2 }'
    Ruft die 2. Spalte ab, in der mehrere Trennzeichen als 1 zählen. Daher ist die 2. Spalte für Ihr System für den 1. Teil des Befehls immer dieselbe.

  • NR gibt Ihnen die Gesamtzahl der verarbeiteten Datensätze oder die Zeilennummer an.

Rinzwind
quelle
1
Oder wenn Sie beide in einer Zeile benötigen df /home | awk '{print $2; print $5;}'.
Videonauth
3
Awk behält die letzte Zeile im ENDBlock, also anstatt tailnur zu verwendenawk 'END { print $2,$5}'
Kevin
Zu Ihrer
Information,
8

Antwort bearbeitet

Wie @kevin angegeben hat, können awkSie nur die letzte Zeile auswählen und die Verwendung von tail vermeiden, indem Sie Folgendes verwenden. ENDWenn Sie zwei Spalten gleichzeitig drucken möchten, können Sie dies tun:

df /dev/sdb1 | awk 'END {print $2,$5}'
1952971772 74%

Ursprüngliche Antwort

Sie können nur die 2. Spalte auswählen:

$ df /dev/sdb1 | tail -1 | awk '{print $2}' 
1952971772

Wobei $2die Position von TAB-getrennten Spalten angibt. Sie können verwenden, cutweil es nur ein Vorkommen von TAB behandelt und hier mehrere TABs zum Abgrenzen einer Spalte vorhanden sind.

noraj
quelle
3
Awk behält die letzte Zeile im ENDBlock, also anstatt tailnur zu verwendenawk 'END { print $2,$5}'
Kevin