Извлечение чисел с помощью команды grep

Как говорит ошибка, вы не можете использовать -iс OUTPUT.

Поскольку входящие пакеты не проходят через цепочки OUTPUT.

-3
24.09.2021, 16:35
2 ответа

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

grep -Eo ",[[:digit:]]+" input.txt | tr -d ","

Или, избегая использования trтолько для grepрешения:

grep -Eo ",[[:digit:]]+" input.txt | grep -Eo "[^,]+"
0
25.09.2021, 06:02

Утилита grepне подходит для извлечения части строки,по крайней мере, если вы хотите использовать стандартные инструменты Unix. Стандартная утилита grepфильтрует целые строки, соответствующие шаблону, но не существует естественного способа извлечения частей строк. Для более детального управления строками можно использовать, например, sed.

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

Здесь мы применяем две подстановки обрезки, одну от начала строки до включения последней запятой в строке и одну от правой скобки до конца строки. Мы отключаем печать каждой строки по умолчанию с помощью -nи явно печатаем результирующую строку после второй подстановки.

sed -n '/sometext(/ { s/.*,//; s/).*//p; }' file

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

sed -e '/sometext(/!d' -e 's/.*,//' -e 's/).*//' file

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

paste -d, -s -

Учитывая данные в вашем вопросе, получаем:

$ sed -e '/sometext(/!d' -e 's/.*,//' -e 's/).*//' file | paste -d, -s -
21,9,231,1112,17
2
25.09.2021, 21:13

Теги

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