Przekieruj wyjście do pliku z polecenia grep potoku poleceń

9

Uruchomiam to:

cat /dev/urandom|hexdump| grep -i "ffff f" > random

i nic nie dostaję do pliku random, po przerwaniu polecenia pozostaje zerowa.

Jak zmusić go do zapisywania danych wyjściowych do pliku?

Muszę napisać wynik do pliku, który powinien zawierać dane wyjściowe takie jak to:

021bc40 7724 d4f5 59ec bcbb ffff fd26 ab3c 9b7c

03a9100 b3a5 8601 fa33 ffff f23c 4326 2e7f 0c8a

0449810 e459 d5af 4e11 ffff fc55 8660 9efb 3c9b

wprowadź opis zdjęcia tutaj

Ruslan Gerasimov
źródło

Odpowiedzi:

14

Użyj --line-bufferedopcji dla grep(a także pozbądź się bezużytecznych cat):

hexdump /dev/urandom | grep --line-buffered -i "ffff f" > random

W ten sposób dane wyjściowe nie są buforowane, ale każda linia jest wstawiana randomnatychmiast. Poleciłbym również użyć teew twojej rurze, aby zobaczyć, ile linii zostało wyprodukowanych:

hexdump /dev/urandom | grep --line-buffered -i "ffff f" | tee random
Dubu
źródło
3

Twój plik jest pusty, ponieważ proces jest przerywany przed zapisaniem pliku na dysk. Tak działa przekierowanie. Aby obejść ten problem, spróbuj:

script -c 'cat /dev/urandom|hexdump|grep -i "ffff f"' -f random

Spowoduje to w zasadzie zapisanie wszystkich danych wyjściowych ekranu do pliku.

Jos
źródło
Wymagało to jeszcze jednego polecenia, ale zostało zrealizowane. Dziękuję Ci.
Ruslan Gerasimov
3

cat /dev/urandom|hexdumplub hexdump /dev/urandomzapisuje w sposób ciągły na standardowym wyjściu i jeśli naciśniesz Ctrl+, Cnic nie zostanie wykonane po tym. Ale możesz ograniczyć wydajność za pomocąhead

hexdump /dev/urandom | head -n1000000 | grep "ffff f" > random  

spowoduje to grepw pierwszych 1000000 wierszach wyniku i zapisuje wynik do pliku.

TuKsn
źródło
Wymagało jeszcze jednego polecenia, ale dało dobry wynik. Dziękuję Ci.
Ruslan Gerasimov
1

Będziesz musiał zapisać dane wyjściowe cat /dev/urandom | hexdumpdo pliku przed wykonaniem go następnym razem. Poniższy skrypt powinien osiągnąć to, czego próbujesz:

cat /dev/urandom | hexdump |
  while IFS= read -r line; do
    printf '%s\n' "$line" >> random;
  done

IFS służy do podziału wyniku na linie tutaj.


(Źródło)

Praca w
źródło
grep "ffff f"nieobecny
Ruslan Gerasimov