Из вашего описания (выделение мое):
Каждое определение начинается с
[*Term*]
и
отделяется от следующего пустой новой строкой
Awk при вызове с нулевым RS (RS=''
) разбивает файл на пустые строки.
Он также способен выбирать на основе строк:
$ var="someothermatch"
$ awk -v RS='' -v var="$var" '$0~var{print}' infile
Должен работать, чтобы получить весь абзац, который совпадает.
Из руководства awk:
Если RS имеет значение нулевой строки, то записи разделяются пустыми строками. Когда RS имеет значение нулевой строки, символ новой строки всегда действует как разделитель полей, в дополнение к любому значению, которое может иметь FS.
попробуйте netcat (например, nc)
echo GET / HTTP/1.0 | nc 0 80
HTTP/1.1 400 Bad Request
Date: Thu, 12 Jan 2017 13:44:23 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Length: 311
Connection: close
Content-Type: text/html; charset=iso-8859-1
echo GET / HTTP / 1.0
) на свой локальный http-сервер Using nc
(netcat
).
Сервер:
$ nc -l localhost 3000
Клиент:
$ nc localhost 3000
И сервер, и клиент будут читать и писать на стандартный вывод/ввод.
Это будет работать, если сервер и клиент находятся на одной машине. В противном случае измените localhost
на внешнее имя сервера.
Немного интереснее "сервер", который сообщает вам время суток, если вы подключитесь к нему и отправите d
, и который выходит из системы, если вы отправите q
:
Сервер (в bash
):
#!/bin/bash
coproc nc -l localhost 3000
while read -r cmd; do
case $cmd in
d) date ;;
q) break ;;
*) echo 'What?'
esac
done <&"${COPROC[0]}" >&"${COPROC[1]}"
kill "$COPROC_PID"
Клиентская сессия:
$ nc localhost 3000 d Thu Jan 12 18:04:21 CET 2017 Hello? What? q
(сервер выходит после q
, но клиент не обнаруживает, что он вышел, пока вы не нажмете Enter).
В целом совет с netcat
- лучший способ.
Но в bash
и ksh
вы также можете сделать это:
exec 3<>/dev/tcp/hostname/port
echo "request" 1>&3
response="$(cat <&3)"
Во многих случаях у меня не было доступа к netcat/socat. У меня также были проблемы с использованием bash exec
в распределенной вычислительной среде.
Из-за его распространенности альтернативным решением является использование возможностей TCP/IP GNU AWK. Он обеспечивает простой синтаксис, основанный на операторе «двухканальный канал -».
Вот модифицированный пример из этого источника , который будет отправлять сообщение TCP через сокет:
BEGIN {
NetService = "/inet/tcp/0/cs.wisc.edu/finger"
print "coke" |& NetService
close(NetService)
}
Полный синтаксис адреса: :/net-type/protocol/local-port/remote-host/remote-port
. Когда для local-port
установлено значение 0, локальный хост автоматически выбирает порт, что обычно является тем, что вам нужно. Вы можете прочитать больше о сетевых возможностях gawk
's TCP/IP по предоставленной ссылке.
Стоит отметить, что это можно сократить, если вы собираетесь отправлять только одно сообщение за одно выполнение awk:
BEGIN {print "coke" |& "/inet/tcp/0/cs.wisc.edu/finger"}