Pobierz pierwszą linię danych wyjściowych polecenia powłoki

98

Podczas próby odczytania numeru wersji vimotrzymuję wiele dodatkowych linii, które muszę zignorować. Próbowałem przeczytać instrukcję headi wypróbowałem następujące polecenie:

vim --version | head -n 1

Chcę wiedzieć, czy jest to właściwe podejście?

nieznany z nazwiska
źródło
4
Jak to się nie udało? Mi to pasuje.
choroba
1
Składnia jest poprawna. Jaki jest błąd ..?
Kaushik Nayak
2
U mnie to działa, ale być może używasz wersji vima, która zapisuje informacje o wersji na stderr. Spróbujvim --version 2>&1 | sed 1q
William Pursell
U mnie też działa - więc tak, twoje podejście jest poprawne :)Sprawdź, czy twój pakiet wyświetla te informacje, stderrponieważ @WilliamPursell zapewnia sprawdzenie.
David C. Rankin,

Odpowiedzi:

139

Tak, to jeden ze sposobów uzyskania pierwszej linii danych wyjściowych z polecenia.

Jeśli polecenie zwraca cokolwiek do standardowego błędu, który chciałbyś przechwycić w ten sam sposób, musisz przekierować standardowy błąd polecenia do standardowego strumienia wyjściowego:

utility 2>&1 | head -n 1

Istnieje wiele innych sposobów na przechwycenie pierwszej linii, w tym sed 1q(wyjdź po pierwszej linii), sed -n 1p(wypisz tylko pierwszą linię, ale przeczytaj wszystko), awk 'FNR == 1'(wypisz tylko pierwszą linię, ale znowu przeczytaj wszystko) itd.

Kusalananda
źródło
4

Użyłbym:

awk 'FNR <= 1' file_*.txt

Jak wskazuje @Kusalananda, istnieje wiele sposobów na przechwycenie pierwszej linii w wierszu poleceń, ale użycie opcji head -n 1może nie być najlepszą opcją przy używaniu symboli wieloznacznych, ponieważ wypisze dodatkowe informacje. Zmiana 'FNR == i'na 'FNR <= i'pozwala uzyskać pierwsze i wiersze.

Na przykład, jeśli masz n plików o nazwie plik_1.txt, ... plik_n.txt:

awk 'FNR <= 1' file_*.txt

hello
...
bye

Ale za pomocą headsymboli wieloznacznych wypisz nazwę pliku:

head -1 file_*.txt

==> file_1.csv <==
hello
...
==> file_n.csv <==
bye
alemol
źródło
3
Zobaczhead -qn1 file_*.txt
F. Hauri,