![Как заставить эту команду awk работать](https://rvso.com/image/76427/%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%8D%D1%82%D1%83%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%83%20awk%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%82%D1%8C.png)
Я хочу, чтобы команда ниже работала, но не могу. Пожалуйста, проверьте это:
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:» и заменяет всю строку этим словом.