Jak sortować za pomocą poleceń grep i sort?

15

Chciałbym utworzyć posortowaną listę wszystkich usług TCP znalezionych w pliku /etc/services, potokować wyjście polecenia grep tcp /etc/servicesdo polecenia sort, a następnie przekierować wyjście tego potoku do pliku ~/pipelab.txt.

Ciągle pojawia się komunikat o błędzie, że moje dane wyjściowe są nieprawidłowe i nie wiem dlaczego.

Oto, co próbowałem ostatnio:

grep tcp /etc/services > ~/pipelab.txt | sort
użytkownik72510
źródło

Odpowiedzi:

11

> ~/pipelab.txtoczywiście należy do polecenia po tej samej stronie operatora potoku |. Oznacza to, że przekierowujesz dane grepwyjściowe do pliku zamiast pipetować go do sort:

grep tcp /etc/services | sort > ~/pipelab.txt
Hauke ​​Laging
źródło
21

Próbujesz przekierować dane wyjściowe grepdo pliku i przesłać je do potoku sort. Nie możesz tego zrobić, a przynajmniej tak nie jest.

Zamiast tego naprawdę chcesz go po prostu posortować:

grep tcp /etc/services | sort

a następnie chcesz przekierować posortowane dane wyjściowe (tj. co wychodzi z sortowania) do pliku, więc przekierowujesz po sortowaniu:

grep tcp /etc/services | sort > ~/pipelab.txt

Zarówno potoki, jak i przekierowania działają, zmieniając kierunek wyjścia polecenia. Dwa z nich walczyły o dane wyjściowe grep(i ostatecznie przekierowanie wygrało i zapisało nieposortowane dane wyjściowe do pliku).

derobert
źródło
Dziękuję bardzo, myślałem, że dopóki wstawię polecenie sortowania w dowolnym miejscu, to nadal będzie działać.
user72510,
1
@ user72510 Rurociągi są przetwarzane w kolejności od lewej do prawej. To jest naprawdę przydatne, na przykład, jeśli chcesz pierwsze pięć wierszy posortowanego wyjścia, możesz to zrobić grep tcp /etc/services | sort | head -n 5. Ważne jest, sortaby zrobić to przed head, inaczej nie dostaniesz linii, które chcesz.
derobert
Dziękuję za wyjaśnienie tego. Biorę lekcje online, więc uczę się. Dodając do tego, że mam 40 lat, powoli się uczę.
user72510,