Предполагая наличие n
строк вывода не -JSON, следующий короткий сценарий передаст эти строки как есть и использует jq
для форматирования оставшихся строк. Предполагается, что входные данные поступают на стандартный ввод сценария, и сценарий берет число n
из первого аргумента командной строки (или по умолчанию равно 5, если этот аргумент не существует ).
#!/bin/sh
n=${1-5}
if [ "$n" -gt 0 ]; then
head -n "$n"
fi
jq.
Сценарий предполагает, что команда head
будет потреблять ровно n
строк ввода. Существуют реализации head
, которые не ведут себя подобным образом и будут считывать более n
строк, не оставляя ввода для обработки jq
. GNU head
ведет себя в этом аспекте хорошо и работает так, как предполагалось.
Тестирование:
$ sh script.sh 2 <file.json
non-json text
on two lines
{
"name": "myapp",
"hostname": "myhost.local",
"pid": 64662,
"source_file_path": "/path/to/src/connector.js",
"req_id": "2339717c-6c3b-4e51-a4b2-5c647efd9c25",
"connector": "abc123",
"level": "INFO",
"req": {
"method": "GET",
"url": "http://backend/server/url"
},
"time": "2016-09-01T06:31:55.099Z",
"v": 0,
"message": "Outgoing request"
}
Ниже приводится вариант описанного выше, который добавляет очень упрощенное обнаружение начала содержимого JSON во входных данных. Предполагается, что документ JSON начинается с первой строки, в которой первым символом является {
.
Сценарий сначала сохраняет входные данные во временный файл (, который удаляется после завершения сценария ), а затем дважды анализирует этот файл. Один раз, чтобы извлечь не -данные JSON, а затем еще раз, чтобы извлечь документ JSON.
#!/bin/sh
tmpfile=$(mktemp)
trap 'rm -f "$tmpfile"' EXIT
cat >"$tmpfile"
sed -n '/^[^{]/{p;d;}; q' <"$tmpfile"
sed -n '/^{/,$p' <"$tmpfile" | jq.
Тестирование:
$ sh script.sh <file.json
non-json text
on two lines
{
"name": "myapp",
"hostname": "myhost.local",
"pid": 64662,
"source_file_path": "/path/to/src/connector.js",
"req_id": "2339717c-6c3b-4e51-a4b2-5c647efd9c25",
"connector": "abc123",
"level": "INFO",
"req": {
"method": "GET",
"url": "http://backend/server/url"
},
"time": "2016-09-01T06:31:55.099Z",
"v": 0,
"message": "Outgoing request"
}
Если использование временного файла кажется неэлегантным, тогда следующий вариант берет путь к входному файлу из командной строки:
#!/bin/sh
infile=$1
sed -n '/^[^{]/{p;d;}; q' <"$infile"
sed -n '/^{/,$p' <"$infile" | jq.
Таймеры — это то, что вам нужно!
systemctl list-timers
перечисляет текущие активные таймеры. На самом деле у Arch есть хорошая статья о них; вы можете прокрутить вниз до места, где они демонстрируют блоки переходного таймера:
systemd-run --on-active="12h 30m" /bin/touch /tmp/foo
касается файла /tmp/foo после двенадцати с половиной часов активности.