Как отмечали другие, буферизация строк grep
является очевидной причиной вашей проблемы.
Однако есть и другие не столь очевидные проблемы с тем, что вы делаете.
Для начала, похоже, что вы используете sed
для добавления апострофов в начало и конец каждой выходной строки, чтобы вы могли передать их в xargs
. В этом нет необходимости даже удаленно - xargs
имеет параметр -d
, который вы можете использовать, чтобы указать ему использовать символы новой строки в качестве разделителя: например, xargs -d '\ n' -r
(параметр -r
- убедиться, что xargs
ничего не делает, если нет строк ввода)
Во-вторых , вы используете регулярные выражения для анализа данных json. Это ненадежно, чрезвычайно сложно или даже невозможно разобраться со сложными / вложенными структурами, хрупко и легко сломается по тем же причинам, по которым использование регулярных выражений для синтаксического анализа XML или HTML ненадежно, чрезвычайно сложно и хрупкий. Не анализируйте XML или HTML с помощью регулярных выражений . Это не работает . То же самое относится к json .
Вместо этого вы должны использовать что-то вроде jq
или jsonpipe
для извлечения полей из данных json.Например:
jq -c 'select(.twNotif.action == "add")' file.txt |
xargs -d'\n' -r -L 1 -P 5 ./testscript.sh
Если вы хотите передать значение поля действия по конвейеру xargs
(без двойных кавычек), вы можете сделать это следующим образом:
jq 'select(.twNotif.action == "add") | .twNotif.action' file.txt |
sed -e 's/"//g' |
xargs -d'\n' -r -L 1 -P 5 ./testscript.sh
Использование jsonpipe
и awk
, вероятно, будет проще для такой работы:
jsonpipe < file.txt |
awk '$1 == "/twNotif/action" {gsub(/"/,""); print $2}' |
xargs -d'\n' -r -L 1 -P 5 ./testscript.sh
(обратите внимание на перенаправление там, в отличие от jq
, jsonpipe
] работает только со стандартным вводом).
Кстати, jsonpipe
преобразует данные json в строчно-ориентированный формат, подходящий для использования с такими инструментами, как sed
, grep
, awk
и т. Д. Например:
$ jsonpipe < file.txt
/ {}
/twNotif {}
/twNotif/originator "api"
/twNotif/chain "test"
/twNotif/txId "08640-0050568a5514"
/twNotif/version "1.0"
/twNotif/msgType "api"
/twNotif/twData {}
/twNotif/twData/api {}
/twNotif/twData/api/hostId "007bdcc5"
/twNotif/twData/api/user "test"
/twNotif/twData/api/cmdTxt "100599"
/twNotif/action "add"
/twNotif/store "test"
/twNotif/msgTime 1467280648.971042
С ним проще работать, чем с jq
, особенно если вам не нужен вывод в формате json.
Это также полезно для перечисления структуры и полей / элементов в json-файле в форме, которую можно легко использовать с jq
. например:
$ jsonpipe
Устройство ввода-вывода (контроллер) занято передачей данных из буфера устройства на устройство. Он переходит от простоя к передаче. Это пик для устройства ввода-вывода. По завершении передачи он возвращается в режим ожидания до следующего запроса.
Кривая ЦП показывает пик, когда передача выполняется, потому что ЦП уведомляется устройством (через прерывание).
График наглядно показывает соотношение состояний CPU и состояний выхода [устройства] с течением времени.
Пики в процессорном времени - это когда процессор занят выполнением своей задачи или спит, в зависимости от того, выполняет ли он синхронную или асинхронную запись.
Спады в процессорном времени - это когда процессор получает уведомление от прерывания о том, что устройство закончило работу, чтобы приступить к созданию буферов для следующего раунда.
Пики в работе устройства - это время, когда оно простаивает в ожидании вывода, ожидая запросов ввода/вывода, а долины - когда контроллер устройства записывает буферы памяти независимо от CPU в реальное устройство. Часто эта запись выполняется через DMA. (Прямой доступ к памяти)
Давайте шаг за шагом посмотрим, что происходит.
Пояснение перед переходом к шагам :Процессор выполняет другие процессы пользователей. Устройство ввода/вывода находится либо в состоянии передачи данных, либо в состоянии ожидания. Как работает прерывание, из книги «Концепции операционной системы»
.When the CPU is interrupted, it stops what it is doing and immediately transfers execution to a fixed location. The fixed location usually contains the starting address where the service routine for the interrupt is located. The interrupt service routine executes; on completion, the CPU resumes the interrupted computation.
Шаг 1:Устройство ввода-вывода получает запрос ввода-вывода. (Устройство ввода-вывода изначально находится в состоянии ожидания)
Шаг 2.:Устройство ввода-вывода начинает передачу данных и, следовательно, переходит в состояние передачи.
Шаг 3:Устройство ввода-вывода завершает свою работу по передаче данных и, следовательно, переходит в состояние ожидания. Далее он делает прерывание.
Шаг 4:ЦП получает прерывание и начинает выполнение процедуры обслуживания прерывания, что показано изменением ее выполнения.
Шаг 5:ЦП продолжает свое предыдущее выполнение.
Те же шаги выполняются для второй половины диаграммы.
Обратите внимание, что слово «состояние» устройства ввода-вывода используется только для ясного объяснения. Надеюсь это поможет.