Jak pobrać tylko potrzebną linię z wyjścia terminala?

16

Chcę uzyskać tylko powiedzmy trzeci wiersz df -hwyniku.

Jakiego rodzaju polecenia powinienem użyć?

emrecnl
źródło
16
Uwaga na przyszłość: to pytanie jest bardzo podstawowe. Zazwyczaj zachęca się do wykazania pewnego wysiłku i tego, co próbowałeś przed zapytaniem.
Sergiy Kolodyazhnyy
Chociaż uzyskanie trzeciej linii pliku o założonym formacie statycznym może być uzasadnione, różni się ona od trzeciej linii programu diagnostycznego, której dane wyjściowe różnią się w zależności od stanu systemu. Na przykład montowanie nowego dysku / partycji alfabetycznie, zanim zepsuje go Twoja bieżąca 3. linia. Dlatego odpowiedź @ Random832 poniżej jest najlepsza.
MarkHu

Odpowiedzi:

31

Spowoduje to wyświetlenie trzeciego wiersza, niezależnie od zawartości.

df -h | sed -n 3p
muru
źródło
+1 dla najmniejszej odpowiedzi: df -h|sed -n 3p.
EKons,
16

dfKomenda faktycznie akceptuje argument identyfikujący system plików, który chcesz. Możesz na przykład użyć df /homelub df /dev/sda3.

Jeśli zamierzasz przeanalizować dane wyjściowe skryptu, możesz użyć go, df -Paby zagwarantować, że nigdy nie zostanie zawinięty w wiele wierszy. Na przykład możesz użyć df -Ph /home | tail -n +2(ale jeśli analizujesz dane wyjściowe skryptu, pamiętaj o możliwości nazw plików ze spacjami)

Losowo 832
źródło
2
Otóż ​​to! Zamiast analizować dane wyjściowe, użyj polecenia, aby podać dokładnie to, czego chcesz.
fedorqui
1
Ale OP powiedział, że chciał linii 3. df /homezawiera nagłówek. Interpretujesz cel użytkownika. Możesz mieć rację. Możesz się mylić, kto wie?
Mike S
@MikeS Tuzin innych odpowiedzi już obejmował uzyskanie linii 3 bez kontekstu. Podałem dodatkowe informacje, aby OP je miał, jeśli będzie to dla niego przydatne. I tail -n +2usuwa nagłówek.
Random832
14

Możesz użyć kombinacji headi tail:

df -h | head -3 | tail -1

Lub

df -h | tail -n +3 | head -1

Zauważ jednak, że dfpozwala odfiltrować dane wyjściowe z samych opcji df, powinieneś najpierw je przejrzeć przed użyciem jakiejkolwiek komendy zewnętrznej.

Sprawdzić man df.

heemayl
źródło
4
+1 za wzmiankę, że df może filtrować określone wpisy
Sergiy Kolodyazhnyy
2
Rzeczywiście, prawie zawsze lepiej jest filtrować same dane przed potokowaniem do programów zewnętrznych.
Zach Mertes,
10

Awk to narzędzie do przetwarzania tekstu, więc jest odpowiednie do tego zadania

df -h | awk 'NR == 3'
Sergiy Kolodyazhnyy
źródło
6

Zakładam, że niekoniecznie szukasz trzeciej linii, ale linii, która wspomina konkretny dysk (np. /dev/sda3) Lub określony punkt montowania (np /home.).

Dlatego zamiast wyświetlać tylko trzeci wiersz, co jest niepewne, ponieważ kolejność wyjściowa może się zmienić i może pojawić się inny wynik, możesz filtrować dane wyjściowe według zawartości i wyświetlać tylko linie pasujące do określonego wzorca lub zawierające słowo kluczowe.

Twoje narzędzie do tego jest grep .

Na przykład, jeśli chcesz wiersz o urządzeniu /dev/sda3, wpisz:

df -h | grep '/dev/sda3'

Jeśli chcesz, aby wiersz wskazujący twój katalog domowy był punktem montowania, użyj:

df -h | grep '/home'
Bajt Dowódca
źródło
3
Lub df -h /dev/sda3lub df -h /home(ten ostatni działa, nawet jeśli nie jest to punkt montowania).
Random832
6

Możesz również użyć perl:

df -h | perl -ne 'print if $.==3' 

Jest $.to bieżący numer wiersza, więc możesz wydrukować N-ty wiersz za pomocą perl -ne 'print if $.==N'.

terdon
źródło
1
Dlatego moim zdaniem Perl jest nadal aktualny. Łączy sed i awk ze strukturalnym językiem programowania, który (choć wielu powie, że jest naprawdę brzydki [i mogę się zgodzić]) jest co najmniej spójny i bardzo przydatny dla tych krótkich jedno-liniowych. Dzięki, terdon. Jest to prawie tak zwięzłe jak przykład sed, choć nieco bardziej szczegółowe.
Mike S
@MikeS chętnie pomoże. Jako haker Perla muszę jednak zaznaczyć, że kod Perla jest tak brzydki, jak to tylko możliwe. Dobrzy programiści potrafią pisać piękny kod w Perlu, po prostu język nie zmusza cię do tego i łatwo tego nie robić.
terdon
2

Moim pierwszym pomysłem będzie konstrukcja głowy-ogona.

Przykład:

df -h | head -3 | tail -1

head -3powoduje, że wyjście zatrzymuje się po trzech wierszach i tail -1wyświetla tylko ostatni wiersz.

Alternatywnie, jeśli wiesz, jak będzie wyglądał wynik, możesz również użyć grepdo znalezienia wierszy zawierających określony ciąg znaków.

Wayne_Yux
źródło