Рейтинг:0

Как сохранить определенные строки выходных данных командной строки

флаг cn

У меня есть исполняемый файл, который выводит на терминал следующее:

---Начинать---
Какой-то текст
Больше текста
-1.
1.
0,39
10
-199
еще немного текста
   Полный
---Конец---

Я хочу записать в файл только числовые значения в терминале. Прямо сейчас я использую

./исполняемый 2>&1 | grep -vE 'S|M|s|^[--]|^[ ]' | тройник log.txt

Кажется, это делает то, что я хочу. В частности, используя -v, я прямо указываю, что исключать. Однако это кажется довольно неэффективным, поскольку мне пришлось бы добавлять весь алфавит (как верхний, так и нижний регистр), чтобы убедиться, что в файл log.txt добавляются только числовые значения.

Есть ли способ лучше записать все числовые значения (положительные и отрицательные) в файл?

флаг in
Вы ищете новое регулярное выражение? '^[0-9-].*$' захватит целые строки, начинающиеся с цифры или знака минус. Или используйте \d для цифр, см., например, [regular-expressions.info](https://www.regular-expressions.info/quickstart.html).
флаг hr
См., например, [grep — Разрешить только регулярное выражение с плавающей запятой] (https://unix.stackexchange.com/questions/397784/only-allow-floating-points-regex) и [Сопоставление чисел с плавающей запятой с регулярным выражением] (https ://www.regular-expressions.info/floatingpoint.html)
bac0n avatar
флаг cn
@pbhj точку следует переместить в класс символов `'^[0-9.-]*$'`, но, как указал @steeldrive, этого может быть недостаточно.
waltinator avatar
флаг it
Если это не начало выражения, "-" путают с оператором "диапазона" ("[0-9]`"). Используйте "`^[-.0-9]+`". Вы также можете использовать опцию `-o` команды `grep`, чтобы вывести только совпадающую строку.
bac0n avatar
флаг cn
@waltinator, который также будет соответствовать началу и концу ...
флаг in
@ bac0n, ни одно из чисел не начинается с десятичной точки, мое регулярное выражение должно было найти строки, начинающиеся с цифры или «-», остальная часть строки может быть любым символом. Если вы поместите точку внутри селектора диапазона, вам нужно будет избежать ее, потому что «.» означает «любой символ один раз», также может потребоваться экранирование «-» (т.е. «\-»), но если он не находится между двумя другими символами, я обнаружил, что механизм регулярных выражений всегда распознает его как отдельный символ. Зависит от версии grep (или другой программы); мой работает для данного ввода в GNU Grep 3.6; проверено на Кали.
bac0n avatar
флаг cn
@pbhj во-первых, шаблон также будет соответствовать начальному и конечному тегам. Затем точка внутри скобок `[.]` интерпретируется буквально (нет необходимости экранировать). Если дефис ставится первым или последним в классе диапазона, он также будет интерпретироваться буквально.
флаг in
Возможно, вы правы в буквальном смысле, с чем у меня нет опыта, но дефис, не требующий экранирования, определенно работает, как я уже сказал, проверено на GNU Grep. Он соответствует началу, потому что он ищет строки с цифрой в начале, он соответствует концу, потому что образец показывает, что ему нужны все строки, на которых есть цифра (или минус). Попробуй.
bac0n avatar
флаг cn
`echo '---Конец---' | grep '^[0-9-].*$'`
Рейтинг:1
флаг cn

Вам просто нужно исключить строки, в которых есть текст. Используйте этот grep в своей команде:

grep -v '[A-Za-z]'

Ответить или комментировать

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