После большого количества документации я обнаружил, что проблема была в версии 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 /
Используйте расширение параметра:
#! /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
#
удаляет шаблон слева, %
справа.
При использовании 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
Вот версия 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