Команда lsof
является достаточно полнофункциональной и позволяет задавать множество различных критериев поиска. В частности, опция -i
позволяет искать по интернет-адресу, включая протокол, делая grep
ненужным. Поэтому можно заменить
lsof | grep TCP
на
lsof -i TCP
lsof
также позволяет указать интересующие вас поля с помощью опции -F
и выводить только их (по одному в каждой строке). Таким образом, мы можем
lsof -i TCP -F 'p'
вывести список PID для процессов, использующих TCP.
Однако, каждый из этих PID имеет префикс "p" (например, "p156"), поэтому, наконец, мы можем использовать cut
, чтобы получить только числовой ID. Это дает нам окончательную команду
lsof -i TCP -F 'p' | cut -c 2-
Конечно, ответ @RobertL тоже вполне подходит, но я люблю бросать вызов самому себе, чтобы не использовать AWK для решения всех моих проблем с обработкой текста.
perl -pe 's/("(?:\\.|[^"])*")|[^\s[\]{}:,"]+/$1||qq("$&")/ge' file.json
Цитирует все, что не цитируется и не является []{}:,whitespace
, так же цитирует числа true
, false
и null
.
perl -pe 's/("(?:\\.|[^"])*")|-?\d+(?:\.\d+)?(?:[eE][-+]?\d+)?/$1||qq("$&")/ge'
Будет специально указывать то, что соответствует спецификации числа json и что еще не заключено в кавычки.
Они выполняют точную токенизацию на основе спецификации JSON, это не приближение.
$ jq 'map_values(tostring)' file.json
{
"id": "1",
"customer": "user",
"plate": "BMT-216-A",
"country": "GB",
"amount": "1000",
"pndNumber": "20000",
"zoneNumber": "4"
}
Перенаправить на новый файл, а затем переместить его на исходное имя файла.
Для более тщательного преобразования чисел в не -плоских структурах в строки рассмотрим
jq '(..|select(type == "number")) |= tostring' file.json
Это будет рекурсивно проверять каждое значение в данном документе и выбирать те, которые являются числами. Затем выбранные значения преобразуются в строки. Строго говоря, он также будет смотреть на ключи, но, поскольку они не могут быть простыми числами в JSON, ключ не будет выбран.
Пример:
$ jq. file.json
{
"a": {
"b": 1
},
"b": null,
"c": [
1,
2,
"hello",
4
]
}
$ jq '(..|select(type == "number")) |= tostring' file.json
{
"a": {
"b": "1"
},
"b": null,
"c": [
"1",
"2",
"hello",
"4"
]
}
Чтобы дополнительно процитировать null
, замените select()
на
select(type == "number" or type == "null")
Я попробовал метод, описанный ниже, и он работал нормально.
Я конвейерил 2 раза, чтобы уменьшить его до своего уровня
Команда:
sed 's/[0-9]\{1,\},\?$/"&/g' filename |
sed '/[0-9]\{1,\}$/s/[0-9]\{1,\}/&"/g'|
sed '/[0-9]\{1,\},$/s/,$/"&/g`'
Выход:
{
"id":"1",
"customer":"user",
"plate":"BMT-216-A",
"country":"GB",
"amount":"1000",
"pndNumber":"20000",
"zoneNumber":"4"
}