Formatowanie AWK Niepoprawne formatowanie polecenia narzędzia dyskowego

0

W tej chwili próbuję nauczyć się awk, więc próbuję tego na disk utilitypolecenie.

Oto dane wyjściowe po uruchomieniu Disk Utility list disk0

/ dev / disk0 (wewnętrzny, fizyczny):
   #: NAZWA TYPU IDENTYFIKATOR ROZMIARU
   0: GUID_partition_scheme * 251,0 GB dysku0
   1: EFI EFI 209,7 MB dysku 0s1
   2: Apple_HFS Macintosh HD 145,4 GB na dysku 0s2
   3: Apple_Boot Recovery HD 650.0 MB disk0s3
   4: System plików Linux 48,0 GB disk0s4
   5: Microsoft Basic Data WINDOWS 38,0 GB na dysku 0s5
   6: Linux Swap 18,8 GB dysku 0s6

Teraz, jeśli uruchomię diskutil list disk0 | awk 'NR > 2 {print}', otrzymam to jako wynik.

   0: GUID_partition_scheme * 251,0 GB dysku0
   1: EFI EFI 209,7 MB dysku 0s1
   2: Apple_HFS Macintosh HD 145,4 GB na dysku 0s2
   3: Apple_Boot Recovery HD 650.0 MB disk0s3
   4: System plików Linux 48,0 GB disk0s4
   5: Microsoft Basic Data WINDOWS 38,0 GB na dysku 0s5
   6: Linux Swap 18,8 GB dysku 0s6

Jak widać, wynik jest zgodny z oczekiwaniami. Problem polega na tym, że kiedy próbuję wydrukować 2 USD, 3 USD i 4 USD, wydruk czasami drukuje „HD”, kiedy powinien wydrukować rozmiar i inne podobne problemy.

diskutil list disk0 | awk 'NR > 2 {print $1}'

0:
1:
2:
3:
4:
5:
6:

Spodziewany wynik

diskutil list disk0 | awk 'NR > 2 {print $2}'

GUID_partition_scheme
EFI
Apple_HFS
Apple_Boot
Linux
Microsoft
Linux

Spodziewany wynik

GUID_partition_scheme
EFI
Apple_HFS
Apple_Boot
System plików Linux
Podstawowe dane Microsoft
Wymiana systemu Linux

Jak widać, polecenie wydaje wyniki zgodnie z oczekiwaniami, aż do systemu plików Linux. Wynika to z faktu, że w słowie są spacje?

Wpływa to teraz na wszystko, co następuje po nim, na przykład

diskutil list disk0 | awk 'NR > 2 {print $3}' wyświetla

* 251,0
EFI
Prochowiec
Poprawa
System plików
Podstawowy
Zamiana

kiedy powinno to pokazać

EFI
Macintosh HD
Odzyskiwanie HD

Windows

Jak mam sformatować AWK zgodnie z oczekiwaniami?

iProgram
źródło

Odpowiedzi:

1

Dzięki bashniemu możesz:

diskutil list disk0 | { read; read; while read i; do echo ${i:6:27}; done; }
  • Pierwsze dwa reads ignorują pierwsze do wierszy.
  • whilePętli odczytuje wiersz po wierszu wejściowego i drukuje żądanej części.

Edycja: Jeśli to konieczne awk, użyj tego:

diskutil list disk0 | awk 'NR>2{$0=substr($0,6,27);sub("^ +","",$0);print}'
  • NR>2 pomija pierwsze dwa wiersze w danych wyjściowych
  • substr() odcina odpowiednią część
  • sub() usuwa wiodące spacje
  • i wreszcie printdrukuje linię
chaos
źródło
To działa, jednak nie mogę użyć awk do sformatowania całego wyjścia.
iProgram
@ iProgram Zredagowałem swoją odpowiedź, zobacz rozwiązanie awk
chaos
@ iProgram Nie rozumiem, masz teraz awk i rozwiązanie nie-awk, jaki jest problem?
chaos
Myślę, że OP chce również wydrukować inne pola („cały wynik”). W tym celu musiałby określić numery kolumn i wyodrębnić je za pomocą substr()pokazanych znaków.
user1016274,
@ user1016274 był poprawny. Chcę to zrobić w ten sposób, że „partycja 1 $ jest sformatowana na 2 $” itd. Właśnie dlatego chcę mieć wszystkie dane wyjściowe.
iProgram
1

diskutildane wyjściowe są formatowane za pomocą wielu spacji, aby wyświetlać je w czystych kolumnach. Wyodrębnij wymagane pola za pomocą substrfunkcji awk .

Na przykład, aby wyodrębnić typ i nazwę diskutil. Funkcje substr wyodrębniają pola z danych wyjściowych diskutil. Na przykład pole nazwy zaczyna się od pozycji 6 i ma długość do 27 znaków. Funkcje gsub po prostu usuwają początkowe i końcowe białe pola z pól.

diskutil list disk0 | awk 'NR > 2 {
   name=substr($0, 33,20);  # name field - position 33, length 20 chars
   gsub(/ /,"",name)    # trim spacing

   type=substr($0, 6, 27);  # type field - position 6, length 27 chars
   gsub(/ /,"",type)    # trim spacing
   print "name="name," type="type
}' 
podejrzenie
źródło
To wcale nie zmieniło wyniku.
iProgram
Odpowiedź została poprawiona.
podejrzenie
To wypisuje poprawne pole, jednak nie mogę teraz użyć awk do sformatowania całego wyniku.
iProgram
Odpowiedź teraz edytuje pola bezpośrednio w awk przy użyciu funkcji substr.
podejrzenie
@ iProgram, mówisz o „sformatuj całe wyjście”. Jak to pasuje do tego, o co prosiłeś?
glenn jackman