awk может использоваться вместо этого?

Я испытал эту ту же проблему при попытке подать gzipped двоичные файлы с IIS6 на прокси-сервер. Я не испытывал проблемы при движении в веб-сайт непосредственно.

Я нашел, что это было причиной в моем случае путем выполнения Скрипача на клиентской машине и осмотра ответа. Скрипач предупреждает, что ответ кодируется и затем жалуется, что магическое число на gzip файле не было корректно.

Я выключил gzip сжатие для двоичных файлов в моем коде, и проблема прекратила происходить.

17
задан 3 October 2011 в 13:29
8 ответов
$ nc localhost 9571 | awk -F: '/rating/ { print $2 }'
32
ответ дан 2 December 2019 в 20:26

Quanta меня опередила, но я добавлю вариант sed , если вы так склонны:

nc localhost 9571 | sed -ne 's/^rating://p'

Впрочем, то же самое, что сказал MadHatter. Ваше текущее решение идеально подходит. (Хотя я бы использовал grep для "^ rating:" , а не просто для слова, чтобы гарантировать, что вы получите только нужную строку.)

14
ответ дан 2 December 2019 в 20:26

Вы также можете просто использовать оболочку:

nc localhost 9571 | 
while IFS=: read key val; do [[ $key = "rating" ]] && echo "$val"; done
9
ответ дан 2 December 2019 в 20:26

да, вы можете (и должны) использовать (один) awk вместо (двух) grep и cut:

$ nc localhost 9571 | awk -F: '/^rating:/ { print $2 }'

Убедитесь, что вы подобрали строку как можно лучше, чтобы избежать уродливых ошибок .

  • / rating / работает,
  • / ^ rating / лучше (безопаснее),
  • / ^ rating: / лучше (в данном случае).
7
ответ дан 2 December 2019 в 20:26

Он может:

nc localhost 9571  | awk -F: '{ if ($1 == "rating") print $2 }' 

(Я не знаю, что вы делаете с localhost выше, поэтому использовал ваш вывод в качестве входных данных для моей команды awk, а затем заменил "cat" на " nc ... "- но все должно быть хорошо.)

Но зачем вам это делать? Метод UNIX состоит в том, чтобы иметь множество небольших инструментов, каждый из которых хорошо выполняет одну задачу, соединенных вместе через конвейеры, вместо использования более крупных многофункциональных инструментов. Вам нужно выбрать одну совпадающую строку, выбрать одно поле из нее: grep выбирает строки с совпадениями, а cut выбирает поля из входных строк; они идеально подходят для этой задачи. Но если вы действительно хотите сделать это все в одном с помощью awk, то готово.

4
ответ дан 2 December 2019 в 20:26

Хотя ответ Quanta самый простой, и я бы тоже его написал, держу пари, вы не знали, что GNU awk (gawk) тоже может работать в сети ? Вы можете написать все это с помощью awk, если действительно хотите:

BEGIN {
    FS = ":"
    f = "/inet/tcp/0/127.0.0.1/9571"
    while ((f |& getline) > 0)
        if ($1 ~ /^rating$/) {print $2}
}

Это может быть полезно, если на сервере не установлен nc, nc имеет ограниченные perms или вам просто нравится awk.

3
ответ дан 2 December 2019 в 20:26

Вы также можете использовать sed,

nc localhost 9571 | sed -n "s / ^ rating: \ ([\ d] * \) / \ 1 / p"

Это гарантирует, что "rating" начинает строку, а цифры следуют за рейтингом:

0
ответ дан 2 December 2019 в 20:26

Если Perl - вариант:

nc localhost 9571 | perl -F: -lane 'print $ F [1] if / rating /'

-a автоматически разбивает каждую строку на @F массив
-F: использует : в качестве разделителя полей вместо пробелов по умолчанию
/ rating / возвращает true, если найдено регулярное выражение.
$ F [1] является вторым элементом массив @F .
Массивы Perl начинаются с элемента 0, тогда как awk начинается с $ 1

0
ответ дан 2 December 2019 в 20:26

Теги

Похожие вопросы