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?

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ę

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
}' 

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.