Chciałbym uzyskać ostatnią kolumnę tej próbki:
[ 3] 1.0- 2.0 sec 1.00 MBytes 8.39 Mbits/sec
[ 3] 2.0- 3.0 sec 768 KBytes 6.29 Mbits/sec
[ 3] 3.0- 4.0 sec 512 KBytes 4.19 Mbits/sec
[ 3] 4.0- 5.0 sec 256 KBytes 2.10 Mbits/sec
...
Jeśli użyję
cut -d\ -f 13
dostaję
Mbits/sec
6.29
4.19
2.10
ponieważ czasami są między nimi dodatkowe spacje.
text-processing
columns
cut
rubo77
źródło
źródło
Mbits/sec
, czy tego właśnie chcesz, czy 2 ostatnie kolumny?Odpowiedzi:
Aby dosłownie odpowiedzieć na twoje pytanie:
lub
Ale tak się nie stanie, jeśli liczba w nawiasach osiągnie 10 itd. Jeśli interesują Cię tylko liczby, możesz usunąć wszystko inne.
źródło
| sed 's/ .*//'
na końcu pierwszych dwóch przykładów. Oczywiście istnieje wiele innych sposobów, aby to zrobić.+
zamiast*
: cat test | sed 's / [^. 0-9] \ + /: / g' | cut -d: -f 6+
a?
w ERE ale pozostawia\+
i\?
BRE niezdefiniowane.Jeśli użyjemy
tr
polecenia wraz z opcją ściśnięcia (-s
flaga), aby przekonwertować wszystkie kolejne spacje na jedną spację, a następnie wykonaćcut
operację spacją jako separatorem - możemy uzyskać dostęp do wymaganej kolumny niosącej liczby.Zobacz poniższy fragment kodu:
cat file | tr -s ' ' | cut -d ' ' -f 8
źródło
Wszystkie te polecenia wypisują ostatnią kolumnę pliku oddzielonego spacjami:
awk '{print $NF}' file
w
awk
,NF
jest liczbą pól i$NF
jest ostatnim polem.perl -lane 'print $F[$#F]' file
-a
dzieli plik z białymi spacjami na tablicę@F
,$#F
jest liczbą elementów w tablicy, więc$F[$#F]
jest ostatnim elementem. Te-n
środki odczytać plik podany w wierszu poleceń i zastosować skrypt zapadają-e
na każdej linii.-l
po prostu dodaje znak nowej linii (\n
) do każdejprint
instrukcji.sed 's/.* //g'
proste wyrażenie regularne, które dopasowuje wszystko do ostatniej spacji i usuwa je, pozostawiając tylko ostatnią kolumnę.
rev file | cut -d' ' -f 1 | rev
rev
odwraca dane wyjściowe, więc ostatnie pole jest pierwsze,cut
z miejscem na separator, aby je wydrukować irev
przywrócić normalny tekst. To nie zadziała, jeśli masz kolejne białe znaki .Na podstawie twoich danych wejściowych domyślam się, że tak naprawdę nie chcesz ostatniej kolumny, ale przedostatniej lub dwóch ostatnich. W takim przypadku użyj ich do wydrukowania ostatnich 2 (
8.39 Mbits/sec
):i te, aby wydrukować przedostatni (
8.39
):źródło
Nie można oddzielić wielokrotnego występowania białych znaków za pomocą
cut
instrukcji:chyba że tekst jest oddzielony tą samą kwotą lub użyjesz go
tr
do usunięcia ich nadmiaru.W inny sposób wykorzystywać alternatywne narzędzia, takie jak
awk
,sed
lubex
.Na przykład:
Wymień
+q!
się-cwq
, aby zapisać zmiany w miejscu.źródło
Użyj jednego linijki Perla:
perl -lane 'print $F[-2]' input_file
Wyjaśnienie:
Opcja
-e
powoduje, że interpreter perla szuka wbudowanego skryptu zamiast w pliku.Opcja
-n
powoduje, że wejście (plik lub STDIN z potoku) jest odczytywane linia po linii.Opcja
-l
usuwa separator rekordów wejściowych (domyślnie zależny od systemu operacyjnego, nowa linia w systemie UNIX) po przeczytaniu linii i dodaje ją na końcu do każdegoprint
Opcja
-a
powoduje podział każdej linii wejściowej na białe znaki na tablicę@F
i$F[-2]
jest drugim elementem liczącym od końca, którym jest pole, które chcesz. Możesz także użyć$F[$#F-1]
, gdzie$#F
jest ostatnim indeksem tablicy@F
, który jest nieco mniej czytelny.źródło