Как я могу оценить аргументы bash в строке после изменения переменных

не совсем уверен, как это описать, но постараюсь объяснить, что я делаю. Я 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, где нет значений.

0
21.09.2017, 17:27
1 ответ

Вы изобретаете велосипед (и неправильно ). Используйте 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]
  }'
1
28.01.2020, 02:44

Теги

Похожие вопросы