Извлечь определенные символы из каждой строки

why the NR_CPUS is this large ?

Потому что существуют настоящие Linux-системы с таким количеством ЦП. Я видел фактические результаты тестов для машин с 1024 процессорами.

Я не имею в виду кластеры независимых небольших систем, я имею в виду отдельные компьютеры с таким количеством ядер ЦП, на которых работает одно ядро ​​Linux.

Например, SGI в настоящее время имеет систему, способную масштабировать до 32 процессорных сокетов. С сегодняшним максимальным числом ядер 22 в линейке Intel Xeon это дает вам 704 ядра, а затем удвоить это с Hyperthreading . Между моментом написания этой статьи и временем, когда вы ее читаете, этот предел ядра, вероятно, будет превышен.

where does the 240 nr_cpumask_bits and nr_cpu_ids come from ?

Вероятно, некоторые ограничения вашего аппаратного обеспечения. Для обработки даже двух физических процессоров требуется специально -разработанная система. Системы, которые могут поддерживать множество физических чипов ЦП, требуют всех видов специальной аппаратной поддержки, чтобы сделать их эффективными:матричные коммутационные матрицы , схемы NUMA и т. д.

3
06.09.2019, 12:54
4 ответа

Использовать GNUgrep(или совместимый )с расширенным регулярным выражением:

grep -Eo "OS=\w+ \w+" file

или базовое регулярное выражение (, вам нужно экранировать+

grep -o "OS=\w\+ \w\+" file
# or
grep -o "OS=\w* \w*" file

Чтобы получить все от OS=до OX=, вы можете использовать grepс perl -совместимым регулярным выражением (PCRE)(-Pпараметр ), если он доступен, и сделать предварительный просмотр:

grep -Po "OS=.*(?=OX=)" file

#to also leave out "OS="
#use lookbehind
grep -Po "(?<=OS=).*(?=OX=)" file
#or Keep-out \K
grep -Po "OS=\K.*(?=OX=)" file

или используйте grep, включая OX=, а затем удалите его с помощью sed:

grep -o "OS=.*\( OX=\)" file | sed 's/ OX=$//'

Выход:

OS=Arundo donax
OS=Setaria italica
7
27.01.2020, 21:08

В Perl два «слова» без пробелов -:

$ perl -lne 'print $1 if /OS=(\S+ \S+)/' input

или все доOX=:

$ perl -lne 'print $1 if /OS=(.*?) OX=/' input 

или все до следующегоsomething=:

$ perl -lne 'print $1 if /OS=(.*?) (\w+)=/' input

С вашим образцом входных данных все они дают один и тот же результат, но результат будет другим, например. такой ввод:

ABC=something here OS=foo bar doo PE=3 OX=1234
4
27.01.2020, 21:08

Более надежным способом является использование sed для синтаксического анализа полного значения до тех пор, пока не будет найдено слово, содержащее следующее =. Таким образом, он будет работать со значением любого размера (, например. если у вас есть шрифт с одним словом или тремя словами ).

sed 's/.*OS=\([^=]*\).*/\1/;s/ [^ ]*$//'

Первый блок захватывает все до OS=, второй блок в группе захвата (, обозначенный \(\)с ), соответствует следующему =и может упоминаться в замене как \1. Следующая замена избавляет от последнего слова, которое является фрагментом следующего присваивания.

Обратите внимание, :^в []означает исключение соответствия символу в этом случае всего, что не является знаком =.

3
27.01.2020, 21:08
awk '{print $(NF-4), $(NF-3)}' file

OS=Arundo donax
OS=Setaria italica 

или

awk -F= '{sub(/OX/,""); print $(NF-3)}' file 

Arundo donax 
Setaria italica
1
27.01.2020, 21:08

Теги

Похожие вопросы