Вывод строки Linux по номеру

Обновлено: 02.07.2024

Как в Linux все является файлом, так и в bash все является строкой.

Да! Технически в Bash нет типов данных. По сути, переменные Bash — это просто строки символов.

И это создает проблему, когда вы пытаетесь выполнять арифметические операции в bash. Числа, которые вы пытаетесь добавить, дают странные результаты.

Чтобы преобразовать строки в целые числа в bash, заключите их в $((X)). Вот так:

Если строка имеет идентифицируемый номер, она будет рассматриваться как число. Пример, который я показал выше, можно исправить следующим образом:

Давайте рассмотрим преобразование строк в числа более подробно, чтобы вы могли использовать арифметические вычисления в bash.

Преобразование строковых переменных в числа

Давайте объявим некоторые "числа", которые в основном представляют собой строки символов.

Вы можете проверить назначенный номер:

Теперь попробуем сложить оба числа и сохранить значение в третьей переменной c :

Как видно из приведенного выше вывода, c также обрабатывается как строка.

Чтобы сложение прошло успешно, его нужно «преобразовать» с помощью арифметического расширения:

Обратите внимание, что c по-прежнему является строкой, пока вы снова неявно не используете то же арифметическое расширение для другой операции, о которой я расскажу позже.

Вышеприведенное эквивалентно:

Давайте воспользуемся третьей переменной d для другой операции:

Все эти неявные объявления по-прежнему являются строками. Это то же самое, как я определил a и b ранее.

Теперь вторая операция:

В приведенном выше выражении сначала вычисляется произведение b и c, а затем следуют сложение и вычитание.

Как я упоминал ранее, все, что вы делаете между $((. )) считается арифметической операцией.

Все эти преобразования работают для целых чисел. Он не будет работать с числами с плавающей запятой, т. е. с десятичными точками.

Попробуйте смешать настоящие строки и числа

Смешивать строки и целые числа по-прежнему безопаснее, чем смешивать кокаин и мяту. Однако это дает странный результат.

Это будет работать, только если есть числа (в виде строки). Если это чистая символьная строка, она не будет волшебным образом преобразована в какие-то числа. Вместо этого он игнорируется, как вы можете видеть в примере выше.

Альтернативный метод: используйте выражение

Вы также можете использовать инструмент expr для оценки, но обратите внимание, что это не "родная" процедура Bash, так как вам необходимо установить coreutils (по умолчанию в Ubuntu) в виде отдельного пакета.

Я надеюсь, что это краткое небольшое руководство помогло вам оценить строки bash как числа. Если у вас есть вопросы или предложения, не стесняйтесь оставлять комментарии ниже.

Поэтому, чтобы извлечь параметр, я должен сделать это в два этапа. Как извлечь число за один шаг?


Этот вопрос уже давно стоит. Если ни один из ответов не дает того, что вы ищете, не могли бы вы обновить свой вопрос, чтобы немного уточнить свои требования?

10 ответов 10

Вы можете использовать tr для удаления всех нецифровых символов, например:


В результате получается, что все числа смешаны вместе, в результате чего в вашем примере получается 122. Как их можно разделить?

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

  • Заменяет все разрывы строк пробелами: tr '\n' ' '
  • Заменяет все не числа пробелами: sed -e 's/[^0-9]/ /g'
  • Удалить начальный пробел: -e 's/^ *//g'
  • Удалить пробелы в конце: -e 's/ *$//g'
  • Сожмите пробелы последовательно до 1 пробела: tr -s ' '
  • Заменить оставшиеся разделители пробелов разрывом строки: sed 's/ /\n/g'



Вот краткий:

с пробелом между цифрами. Надеюсь, это поможет.

Расширение параметров, похоже, является повесткой дня.

Конечно, это зависит от формата $string. Но, по крайней мере, для приведенного вами примера это работает.

Это может быть лучше решения awk от anubhava, для которого требуется подоболочка. Мне также нравится решение Чепнера, но регулярные выражения «тяжелее», чем расширение параметров (хотя, очевидно, они более точны). (Обратите внимание, что в приведенном выше выражении [^0-9] может выглядеть как атом регулярного выражения, но это не так.)

Вы можете прочитать об этой форме или расширении параметров на справочной странице bash. Обратите внимание, что $ (а также ) является башизмом и несовместим с традиционными оболочками Bourne или posix.

Общее количество символов любых строковых данных указывает длину строки.Когда мы работаем со строковыми данными, важно подсчитывать длину строки для различных задач программирования. Встроенная функция существует для подсчета общего количества символов во многих языках программирования. Но в bash нет такой встроенной функции. Длина строки может быть подсчитана в bash несколькими способами. Как узнать длину строковых данных в bash, показано в этом руководстве на различных примерах.

Синтаксис:

Для подсчета длины строки можно использовать любой из следующих синтаксисов.

Вывод:

После выполнения вышеуказанной команды появится следующий вывод.


Пример 2: Использование `expr` для подсчета длины строки

Еще один способ подсчитать длину строки — использовать команду `expr` с ключевым словом length. Следующие команды присваивают значение переменной $string, сохраняют значение длины переменной $len и печатают значение $len.

$ string = "Язык гипертекстовой разметки"
$ len = ` expr length " $string " `
$ echo "Длина строки $len "

Вывод:

После выполнения вышеуказанной команды появится следующий вывод.


Создайте файл bash с именем «len1.sh» и добавьте следующий скрипт. Здесь у пользователя будет получено строковое значение, а длина строкового значения будет подсчитана с помощью команды `expr`, которая будет напечатана позже.

len1.sh

Вывод:

Здесь в качестве входных данных используется фраза «Мне нравится программирование», а длина строки равна 18.


Пример 3: Использование `wc` для подсчета длины строки

Создайте файл bash с именем «len2.sh» и добавьте следующий скрипт. Этот сценарий считывает первый аргумент командной строки в переменную $strval и подсчитывает длину $strval с помощью команды `wc`, которая будет напечатана позже.

len2.sh

Запустите скрипт с одним аргументом командной строки.

Вывод:

Длина «Hello World» составляет 12 байт, которые выводятся на печать.


Пример 4: Использование `awk` для подсчета длины строки

Создайте файл bash с именем «len3.sh» и добавьте следующий скрипт. Здесь имя пользователя будет принято в качестве входных данных, и проверьте, меньше ли длина $username 6 или нет. Если длина меньше 6, вывод будет «Недопустимое имя пользователя», в противном случае вывод будет «Действительное имя пользователя».

len3.sh

Вывод:

Здесь, когда в качестве имени пользователя используется «fahmida», оно допустимо, а когда в качестве имени пользователя используется «lily», оно недействительно.


Вывод:

Различные способы подсчета длины строки в bash показаны в этом руководстве на различных примерах. Пользователь может применить любой из указанных способов, чтобы узнать длину строки.

Об авторе

Фахмида Есмин

Я веду курсы веб-программирования. Мне нравится писать статьи или учебные пособия на различные темы в области ИТ. У меня есть канал на YouTube, на котором публикуются различные учебные пособия по Ubuntu, Windows, Word, Excel, WordPress, Magento, Laravel и т. д.: Справка Tutorials4u.

Информационный аватар участника

51, 0

У меня есть файл a.txt, содержимое которого указано ниже:

У меня есть переменная vCount, которая содержит число.

Мне нужно извлечь 22454750 из вышеуказанного файла и сравнить с переменной vCount. Если совпадение в порядке, иначе выйдите.

Я использовал awk для извлечения числа, как указано ниже:

Значение vCount равно 22454750.
Я получил сообщение о несоответствии и ошибка нечислового сравнения.

Ребята, помогите, пожалуйста, с вышеуказанной проблемой. Кажется, что fileCount - это строка. Как преобразовать его в число?

Информационный аватар участника

2050, 105 

попробуйте ниже, если заблокируете

Информационный аватар участника

51, 0

Спасибо за ответ. Но после использования вышеуказанного блока if я все еще получаю сообщение об ошибке.
Я видел в режиме отладки значение fileCount, как указано ниже:

условие if не может соответствовать, как показано ниже:

Информационный аватар участника

2050, 105 

Вы должны исправить источник, из которого вы заполняете данные в переменных.. в одной переменной вы получаете пробел, а в другой лишнее \r

Информационный аватар участника

1 613, 160

Информационный аватар участника

12 315, 4 560

Здравствуйте, Арун!
Если вы не можете (или не хотите) исправлять источник ввода, попробуйте один из следующих способов:

Как видно из сценария, я обычно использую оболочку Korn; но этот сценарий будет работать с любой оболочкой, соответствующей POSIX (включая как ksh, так и bash).

Как сказал Трилистник, при сравнении арифметических значений необходимо использовать -le вместо и -ge вместо >= . С неравенством не имеет большого значения, используете ли вы != или -ne, хотя -ne предпочтительнее, если вы сравниваете числа. Для равенства форма тестовой команды определяет оператор, который следует использовать при сравнении строк:

Читайте также: