Как заставить эту команду awk работать

Как заставить эту команду awk работать

Я хочу, чтобы команда ниже работала, но не могу. Пожалуйста, проверьте это:

echo "random string random string mark: abcde random string random string" |
    awk '{gensub(/^.*mark: (.{5,5}).*$/,"\\1","g"); print}'

Я хочу, чтобы эта команда возвращала только "abcde". Но она всегда возвращает всю входную строку. Почему?

решение1

Команда gensub не изменяет строку. Результатом является вывод функции.

Пожалуйста попробуйте:

echo "random string random string mark: abcde random string random string" |
awk '{print(gensub(/^.*mark: (.{5,5}).*$/,"\\1","g"))}'

Редактировать:

Оказывается, пользователю необходимо проанализировать верхний вывод, что и делается (как и просил пользователь):

top -b -n 1 -d 1 |
awk 'NR==1{print(gensub(/.*load average: ([0-9\.\, ]+).*$/,"\\1","gs"))}'

Примечание: разрешено использовать как точку, так и запятую для локалей, использующих запятую в качестве десятичного разделителя.

Пожалуйста, посмотрите на mpstatкак представлено здесь, возможно, он лучше подойдет для ваших нужд.

решение2

Перефразируя ваш вопрос: вы хотите напечатать первое слово после строки «mark:».

В пути, в awk:

echo "random string random string mark: abcde random string random string" | \
awk -v RS="mark: " 'NR==2{print $1}'

Приведенный выше код разбивает строку на две записи, разделенные символом «mark:», а затем печатает первое слово второй записи (которое равно «abcde»).

В sed:

echo "random string random string mark: abcde random string random string" | \
sed 's/.*mark: \([^ ]*\).*/\1/'

Приведенный выше код использует регулярные выражения для поиска первого слова без пробела после «mark:» и заменяет всю строку этим словом.

Связанный контент