Очень вероятно у Вас есть 64-разрядное, только система (в противоположность мультиlib один) и Ваш динамический загрузчик не распознает 32-разрядный двоичный файл как исполняемый файл. Необходимо будет установить 32-разрядную версию glibc (который включает динамического компоновщика/загрузчик - и из которого, который должен быть Вами, видит на первой строке вывода strings binary
, между прочим), и любые другие библиотеки двоичный файл связан против или 64-разрядная версия рассматриваемого двоичного файла. Также см. " не показанное" сообщение при выполнении 32-разрядного двоичного файла в 64-разрядной системе для получения дополнительной информации.
SWUR
Решение
awk -F'-' '{sub(/[^[:digit:]]+/, "", $1); a[$1]} END{for (k in a) ++i; print i}' file
8
С помощью grep
отфильтровать только цифры:
grep -Eo '[0-9]+-' file | sort -u | wc -l
[0-9]
Совпадает с любым символом от 0 до 9 (любая цифра). +
в расширенных регулярных выражениях означает по крайней мере один символ (поэтому опция -E
используется с grep
). Таким образом, [0-9]+-
соответствует одной или нескольким цифрам, за которыми следует -
. -o
печатает только ту часть, которая соответствует вашему образцу, поэтому при вводе abcd23-gf56
, grep
будет печататься только 23-
. сортирует -u
сортирует и фильтрует уникальные записи (в связи с -u
), а wc -l
подсчитывает количество строк во входных данных (отсюда и количество уникальных записей). Используйте расширенный grep и ищите четыре цифры, говоря grep только перечислять совпадения (в отличие от целой строки, которая используется по умолчанию):
grep -Eo '[0-9]+' <filename>
Отсортируйте этот список чисел и выведите только уникальные:
sort -u
Посчитайте количество строк:
wc -l
Сложите все вместе:
$ grep -Eo '[0-9]+' filename | sort -u | wc -l
8
Вы можете использовать:
tr -dc '\-0-9\n' | sort -u -t- -nk1,1 | grep -c .
... что, по общему признанию, более чем немного вдохновлено ответом муру. Однако, по-другому я использую grep
для подсчета строк, а не wc
, если на входе есть пустые строки. В его ответе нет проблемы с пустыми строками, так как grep -o
выведет только строки с их совпадением (так как здесь grep -c
считает только их), но tr
does выводит пустые строки, так как новая строка является одним из немногих символов, которые она не удаляет. Это означает, что любое количество пустых строк во входных данных исказит результаты работы wc
на единицу.
Таким образом, tr
здесь, вероятно, более эффективен, чем grep -o
, но, вероятно, wc
бьет grep
в отделе счета. Мне нравится, что так я думаю из соображений переносимости, а также потому, что обычно я стараюсь сначала подрезать данные самым эффективным фильтром, а менее эффективные - использовать позже в цепочке.
Это позволяет сортировать
выбирать биты на строку, которые он будет рассматривать в своем -u
nique сортировке, основываясь на своем -n
umeric сортировке -k
ey, которую он разбивает на свой -t-
ab разделитель. tr
-d
возводит во входной сигнал -c
элемент любого числового, тире или байта новой строки. Таким образом - до тех пор, пока не появится -
тире, возникающей до числовых строк, которые вы хотите сравнить, единственной вещью, оставшейся до любой строки, будет:
#nothing at all
...или......
[numbers]
... или....
[numbers]-[more numbers]more-dashes-...
Таким образом, когда выходные данные направлены на сортировку , мы инструктируем его только для того, чтобы сравнить числовые строки, встречающиеся до тире, если таковой имеется. Таким образом, тире или нет - единственные числа, которые имеют значение, это те, которые вы хотите сосчитать.
Итак, мы grep -c
ount строк, содержащих хотя бы одну . Символ
. Следующая команда печатает 8
:
tr -dc '\-0-9\n' <<\IN | sort -u -t- -nk1,1 | grep -c .
psf7433-nlhrms
unit7433-nobody
unit7333-opera
bpx7333-operations
app7333-osm
unit7330-partners
psf7331-pdesmond
unit7333-pro-09-0jm
mnp7330-redir09o-0ect
unit7333-retailbanking
cpq7333-rkarmer
unit6333-sales
ring7323-support
unit7133-telco
post7323-uadb
sun7335-ukhrms
burp7133-wfnmreply
IN