
Я хочу, чтобы команда ниже работала, но не могу. Пожалуйста, проверьте это:
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:» и заменяет всю строку этим словом.