Wireshark "следует, потоковая функция" TCP показывает полезную нагрузку данных, которая течет в обоих направлениях на выбранном сокетном соединении. Таким образом, это подходит пакеты сокетным соединением, которое является комбинацией Host1_IP_address:port <-> Host2_IP_address:port.
Можно читать больше на веб-странице wireshark по http://www.wireshark.org/docs/wsug_html_chunked/ChAdvFollowTCPSection.html
Я не вижу способа написать скрипт оболочки для этого. Не существует (документированного) способа изменения для каждого тома приложения с помощью [112807]pactl[112808]/[112809]pacmd[112810]. Также я не вижу способа определить, когда новый клиент добавляется без многократного опроса, например:
Импульсный аудио может быть настроен на запись в журнал через [112811]syslog[112812], так что одна из возможностей - это сценарий, вызываемый через [112813]rsyslog[112814] (если он есть в дистрибутиве). Смотрите мой ответ [112815] здесь[112816], чтобы узнать, как это сделать. Это, конечно, зависит от регистрирующей информации о новых клиентах [112817]pulseaudio[112818].
В вашем Regexp вы должны знать, что \ NO.
- это ссылка на обратную ссылку для узора в скобках ()
. Таким образом, Regexp должен быть S @ ^ (\ S * Access_Log). * $ @ \ 1 / dev / stdout /; @ '
Я могу предложить
sed '/access_log/s|/[^;]\+|/dev/stdout|'
HINT: намерен использовать /
Внутри патерна вы можете свободно изменить ///
для каждого символа, который вы хотите S ###
, например
Подсказки в комментариях @derobert и @ Graeme полезны, но формат вывода неудобна, поэтому я написал анализатор для преобразования его на 0 0,0
, который проще разбираться. При этом я также добавил помощник, чтобы легко изменить громкость.
Можно встроить это в петлю и делать все, что вы хотите. Это в Ним Язык .
import osproc, strutils, pegs, os, parseopt2, sequtils
type Application = object
id: int
name: string
volume: float
var verbose = false
proc tryExec(cmd): auto =
if verbose: echo("executing $1" % [cmd])
let output = execCmdEx(cmd)
if output.exitCode != 0:
raise newException(EBase, "Failed to execute `$1` with error code $2\nOutput:\n===\n$3\n===" %
[cmd, $output.exitCode, output.output])
return output.output
iterator getPlayingApps(): auto =
let paOutput = tryExec("pactl list sink-inputs")
let sinkStrings = paOutput.split("\l\l")
for str in sinkStrings:
var num: int
var volume: float
var applicationName: string
var matches = ["", ""]
if str.find(peg"'Sink Input #'{\d+}", matches) != -1:
num = parseInt(matches[0])
else:
raise newException(EBase, "Could not find sink input number in \n===\n$1" % [str])
if str.find(peg"'Volume'@'/'\s*{\d+}'%'", matches) != -1:
volume = parseFloat(matches[0])
else:
raise newException(EBase, "Could not find application volume in \n===\n$1" % [str])
if str.find(peg"'application.name = ""'{[^""]+}'""'", matches) != -1:
applicationName = matches[0]
else:
raise newException(EBase, "Could not find application name in \n===\n$1" % [str])
yield Application(id: num, name: applicationName, volume: volume)
proc adjustAppVolume(app: Application, percent: float) =
let nextVol = min((app.volume + (app.volume * (percent - 100) / 100.0)).int, 100)
discard tryExec("pactl set-sink-input-volume $1 $2%" % [$app.id, $nextVol])
proc adjustName(name: string, percent: float) =
for app in getPlayingApps():
if app.name.contains(peg(name)):
adjustAppVolume(app, percent)
proc printInfo() =
for app in getPlayingApps():
echo("$1\t$2\t$3" % [$app.id, app.name, $app.volume])
var params: seq[string] = @[]
for kind, key, val in getopt():
case kind
of cmdArgument:
params.add(key)
of cmdLongOption, cmdShortOption:
case key
of "help", "h":
echo "usage: parsepa [-h|--help] [-v|--verbose] [<name expression> percent (-a|--adjust)] [-p|--print]"
quit(QuitSuccess)
of "verbose", "v":
verbose = true
of "adjust", "a":
adjustName(params[0], parseFloat(params[1]))
quit(QuitSuccess)
of "print", "p":
printInfo()
quit(QuitSuccess)
else:
echo "Invalid Argument"
quit(QuitFailure)
else:
echo "Invalid Argument"
quit(QuitFailure)
X64 Binary в этом весте, для ленивых: https://gist.github.com/flaviut/9feb9a75bd452e6ddd03