Вот как я получаю информацию, чтобы обеспечить явные зависимости для файла спецификации:
Сawk
:
awk -F '[[:digit:]]' 'NF > 18'
Мы используем цифры в качестве разделителя полей, поэтому количество полей будет равно единице плюс количество цифр(x1y
делится на x
и y
), поэтому выше мы ищем строки, которые имеют не менее 18 цифр.
(на mawk
, замените [:digit:]
на 0-9
. mawk
не поддерживает классы символов POSIX, но его [0-9]
, в отличие от других awk
реализаций, соответствует только 0123456789 независимо от локали. Переносимо, вы можете использовать [0123456789]
или вы можете использовать [0-9]
, если вы знаете, что текст не содержит не -данных ASCII ).
Для строк, которые имеют ровно 18 цифр, это будет:
awk -F '[[:digit:]]' 'NF == 19'
С помощью sed
не менее 18 цифр:
sed -e 's/[[:digit:]]/&/18;t' -e d
Сgrep
:
grep -E '(.*[[:digit:]]){18}'
Как насчет использования возвращаемого значения Perltr
(аналогично использованию возвращаемого значения awkgsub
)
$ perl -ne 'print if tr{0-9}{0-9} >= 18' file
FFF1B976-9DDE-11E7-9C3D-6241D7D553BE
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
Чтобы найти строки с 18 цифрами([0-9]
)и более, вы можете использовать grep
.
egrep '([0-9][^0-9]*){18}'
или
grep -E '([0-9][^0-9]*){18}'
egrep
совпадает с grep -E
.
grep # Command to filter text using regular expressions
-E # Use extended regex
(
[0-9] # Exactly one digit
[^0-9]* # 0 or more characters except digits
)
{18} # Find 18 times
Предположим, что данные сохранены в файле с именем file.txt
, тогда вы можете сделать что-то вроде:
#!/bin/bash
cat file.txt | while IFS= read line; do
n=$(echo $line | awk '{print gsub("[0-9]", "")}')
if [[ $n -gt 17 ]]; then
echo $line
fi
done
FFF1B976-9DDE-11E7-9C3D-6241D7D553BE
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
или
awk 'gsub("[0-9]", "&") >= 18'