Я хотел бы получить последний столбец этого образца:
[ 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
...
Если я использую
cut -d\ -f 13
я получил
Mbits/sec
6.29
4.19
2.10
потому что иногда есть дополнительные пробелы между ними.
text-processing
columns
cut
rubo77
источник
источник
Mbits/sec
это то, что вы хотите, или 2 последних столбца?Ответы:
Чтобы ответить на ваш вопрос буквально:
или
Но этого не произойдет, если число в скобках достигнет 10 и т. Д. Если вас интересуют только цифры, вы можете удалить все остальное.
источник
| sed 's/ .*//'
в конце первых двух примеров. Конечно, есть много других способов сделать это.+
вместо*
: кошка тест | sed 's / [^. 0-9] \ + /: / g' | cut -d: -f 6+
и?
на ERE, но оставляет,\+
и\?
на BRE не определено.Если мы используем
tr
команду вместе с опцией ( флагом) squeeze-s
для преобразования всех нескольких последовательных пробелов в один пробел, а затем выполняемcut
операцию с пробелом в качестве разделителя - мы можем получить доступ к необходимому столбцу, содержащему числа.Обратитесь к приведенному ниже коду:
cat file | tr -s ' ' | cut -d ' ' -f 8
источник
Все эти команды будут печатать последний столбец файла, разделенного пробелами:
awk '{print $NF}' file
in
awk
,NF
число полей и$NF
последнее поле.perl -lane 'print $F[$#F]' file
-a
разбивает файл на пробел в массив@F
,$#F
это количество элементов в массиве, так же$F[$#F]
как и последний элемент. В-n
средстве чтение файла , заданный в командной строке и применить скрипт передается с-e
каждой строкой.-l
просто добавляет символ новой строки (\n
) к каждомуprint
утверждению.sed 's/.* //g'
простое регулярное выражение, которое сопоставляет все с последним пробелом и удаляет его, оставляя только последний столбец.
rev file | cut -d' ' -f 1 | rev
rev
инвертирует вывод, так что последнее поле является первым,cut
с пробелом для его печати иrev
возврата текста в нормальное состояние. Это не сработает, если у вас есть последовательные пробелы .Исходя из вашего ввода, я предполагаю, что вы на самом деле не хотите последний столбец, а предпоследний или два последних. В этом случае используйте их, чтобы напечатать последние 2 (
8.39 Mbits/sec
):и эти, чтобы напечатать предпоследний (
8.39
):источник
Вы не можете отделить множественные вхождения пробелов, используя
cut
в соответствии с руководством:если текст не разделен на ту же сумму или вы используете
tr
для удаления избытка их.В противном случае используйте альтернативные инструменты, такие как
awk
,sed
илиex
.Например:
Замените
+q!
на,-cwq
чтобы сохранить изменения на месте.источник
Используйте perl one-liner примерно так:
perl -lane 'print $F[-2]' input_file
Объяснение:
Опция
-e
заставляет интерпретатор perl искать скрипт внутри строки, а не в файле.Опция
-n
заставляет ввод (файл или STDIN из канала) читать построчно.Опция
-l
удаляет разделитель входной записи (зависит от ОС, по умолчанию - новая строка в UNIX) после чтения строки и добавляет его в конце к каждомуprint
Опция
-a
заставляет каждую входную строку разбиваться на пустое пространство на массив@F
, и$F[-2]
является вторым элементом, считая с конца, то есть поле, которое вы хотите. Вы также можете использовать$F[$#F-1]
, где$#F
последний индекс массива@F
, который немного менее читабелен.источник