Как сделать получить подстроку на основе индекса другой строки

После большого количества документации я обнаружил, что проблема была в версии openssl , в моем случае я использовал openssl 1.1.x, поэтому, когда был выпущен httpd 2.4.23, openssl 1.1.0 все еще был бета-версией, Я установил openssl 1.0.2j и скомпилировал apache с новым ssl:

./ configure --with-apr = / usr / local / apr / bin --with-ssl = / usr / local / ssl / bin /

1
18.03.2016, 01:28
3 ответа

Используйте расширение параметра:

#! /bin/bash

strings=('Job with id 0 ended with status COMPLETED, return code 16, in 1 minute 12 seconds'
         'Job with id 0 COMPLETED with return code 255'
        )

for string in "${strings[@]}" ; do
    code=${string#*return code }
    code=${code%%[!0-9]*}
    echo $code
done

# удаляет шаблон слева, % справа.

2
27.01.2020, 23:19

При использовании perl решение, использующее регулярное выражение, может быть таким:

perl -ne 'print "$ 2 \ n" if m / (code) (\ d *) /' a. txt

Это выводит числа 16 и 255 в стандартный вывод, каждое в отдельной строке ( \ n ). Здесь a.txt содержит две строки

Job with id 0 ended with status COMPLETED, return code 16, in 1 minute 12 seconds
Job with id 0 COMPLETED with return code 255
2
27.01.2020, 23:19

Вот версия sed :

sed -e 's/.*return code \([0-9]\+\).*/\1/' logfile.txt

Она удаляет все из строки, кроме цифр, следующих сразу за кодом возврата .

или, используя расширенные регулярные выражения с GNU sed:

sed -r -e 's/.*return code ([0-9]+).*/\1/' logfile.txt 

ПРИМЕЧАНИЕ: некоторые версии sed используют -E вместо -r для включения расширенного регулярного выражения.

Также обратите внимание, что эти сценарии sed будут печатать без изменений любые строки, не соответствующие регулярному выражению. Если это не то, что вам нужно, используйте параметр sed -n и команду p для печати только совпадающих строк, например:

sed -n -r -e 's/.*return code ([0-9]+).*/\1/p' logfile.txt 
0
27.01.2020, 23:19

Теги

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