не совсем уверен, как это описать, но постараюсь объяснить, что я делаю. Я BASH
бился головой о стену, пытаясь понять, как передать строку напр. {command: $ 1}
в скрипт и пусть он заполнит $ 1
соответствующим значением.
Я пытаюсь преобразовать мой вывод lsof
в json, захватить нужные столбцы после синтаксического анализа с помощью awk
и форматирования, установки ключа и значений с помощью моего скрипта.
#!/bin/bash
FORMAT=$1
(
IFS=' ';
while read line; do
set -- $line;
echo $FORMAT
done
)
lsof -Pn | grep LISTEN | awk '{print $1,$2,$3,$4,$5,$8,$9}' | ~/.scripts/json "{command:\$1,pid:\$2,user:\$3,fd:\$4,protocol:\$5:\$6,host:\$7}"
{command:$1,pid:$2,user:$3,fd:$4,protocol:$5:$6,host:$7}
, если я удалю косую черту, я получаю
{command:,pid:,user:,fd:,protocol::,host:}
{command:webstorm,pid:5270,user:daviddiefenderfer,fd:142u,protocol:IPv4:TCP,host:127.0.0.1:6942}
Я не уверен, что именно происходит, но я хотелось бы понять, я предполагаю, что переменные $ [1-7]
оцениваются до того, как попадут в цикл while, где нет значений.
Вы изобретаете велосипед (и неправильно ). Используйте jq
для создания JSON.
lsof -Pn |
awk '/LISTEN/ {print $1,$2,$3,$4, $5,$8,$9}' |
jq -R 'split(" ") |
{
command:.[0],
pid:.[1],
user:.[2],
fd:.[3],
protocol: "\(.[4]):\(.[5])",
host:.[6]
}'
Если ваша версия jq
поддерживает регулярные выражения, вы также можете отказаться от вызова awk
:
lsof -Pn | jq -R '
select(match("LISTEN")) |
[splits(" *")] |
{
command:.[0],
pid:.[1],
user:.[2],
fd:.[3],
protocol: "\(.[4]):\(.[7])",
host:.[8]
}'