Я хотел бы получить номер в rating
качестве вывода из этого
# nc localhost 9571
language:
language:en_ZA.UTF-8
language:en_ZW.UTF-8
session-with-name:Ubuntu Classic (No effects):gnome-session --session=2d-gnome
session-with-name:Ubuntu (Safe Mode):gnome-session -f --session=2d-gnome
session-with-name:Ubuntu Classic:gnome-session --session=classic-gnome
xsession:/etc/X11/Xsession
rating:94
Я могу сделать это так
# nc localhost 9571 | grep rating | cut -d: -f2
94
но можно было awk
бы использовать вместо этого для более простого решения?
Ответы:
источник
awk -F: '$1 == "rating" {print $2}'
awk -F: '/^rating:/ { print $2 }'
?Кванта опередил меня, но я включу
sed
вариант, если вы склонны так:То же самое сказал и MadHatter. Ваше текущее решение отлично звучит. (Хотя я предпочел бы
"^rating:"
не просто слово, чтобы убедиться, что вы получите только ту строку, которую хотите.)источник
sed
! Он так недооценен и недооценен ...Вы также можете просто использовать оболочку:
источник
nc
. Ницца!да, вы можете (и должны) использовать (один) awk вместо (двух) grep и cut:
Будьте уверены, чтобы соответствовать вашей линии как можно лучше, чтобы избежать уродливых ошибок.
/rating/
работает,/^rating/
лучше (безопаснее),/^rating:/
лучше всего (в этом случае).источник
Он может:
(Я не знаю, что вы делаете с localhost выше, поэтому использовал ваш вывод в качестве входных данных для моей команды awk, а затем заменил «cat» на «nc ...» - но это должно быть хорошо.)
Но зачем ты это делаешь? Способ UNIX состоит в том, чтобы иметь множество небольших инструментов, каждый из которых хорошо выполняет свою задачу, соединенных вместе с помощью конвейеров, а не с помощью более крупных многофункциональных инструментов. Вам нужно выбрать одну совпадающую строку, выбрать из нее одно поле:
grep
выбрать строки с совпадениями иcut
выбрать поля из входных строк; они идеально подходят для этой задачи. Но если вы действительно хотите сделать это все в одном с помощью awk, ну, вот и все.источник
grep
иcut
требуется порождение двух процессов, а для использованияawk
(илиsed
) требуется только один. Создание процесса является вычислительно дорогим. Кроме того, в отличие от использованияperl
илиruby
(и др.),sed
Иawk
гораздо более легкий фронт.Хотя ответ Кванты самый простой и тот, который я бы написал тоже, держу пари, вы не знали, что GNU awk (gawk) тоже может работать в сети ? Вы можете написать все это с помощью awk, если вы действительно хотите:
Это может быть полезно, если на сервере не установлен nc, nc имеет ограниченные привилегии или если вам действительно нравится awk.
источник
Вы также можете использовать Sed,
nc localhost 9571 | sed -n "s/^rating:\([\d]*\)/\1/p"
Это будет гарантировать, что «рейтинг» начинает строку, и что цифры следуют за
rating:
источник
Если Perl вариант:
nc localhost 9571 | perl -F: -lane 'print $F[1] if /rating/'
-a
автоматическое разбиение каждой строки в@F
массиве-F:
используется:
в качестве разделителя полей, вместо значения по умолчанию пробела/rating/
возвращает значение true, если найдено регулярное выражение,$F[1]
являющееся вторым элементом@F
массива.Массивы Perl начинаются с элемента 0, тогда как awk начинается с $ 1
источник