Сценарий оболочки, который фильтрует вывод команды и сохраняет его в формате JSON - PullRequest
0 голосов
/ 20 ноября 2018

никогда раньше не работал со сценариями оболочки, но мне нужно в моей текущей задаче.
Поэтому мне нужно запустить команду, которая возвращает результат, подобный этому:

    awd54a7w6ds54awd47awd refs/heads/SomeInfo1  
    awdafawe23413f13a3r3r refs/heads/SomeInfo2 
    a8wd5a8w5da78d6asawd7 refs/heads/SomeInfo3 
    g9reh9wrg69egs7ef987e refs/heads/SomeInfo4 

И мне нужно выполнить циклкаждая строка вывода получает только часть SomeInfo и записывает ее в файл в таком формате:

    ["SomeInfo1","SomeInfo2","SomeInfo3"]

Я пробовал что-то вроде этого:

    for i in $(some command); do
      echo $i | cut -f2 -d"heads/" >> text.txt
    done

Ноя не знаю, как отформатировать его в массив без использования временного файла.
Извините, если вопрос тупой и, вероятно, слишком простой, и я уверен, что смогу разобраться сам, но у меня просто нетвремя для этого, потому что это просто дополнительная функция, которую я лично хочу реализовать.

Ответы [ 4 ]

0 голосов
/ 20 ноября 2018

Использование Perl с одной строкой

$ cat petar.txt
    awd54a7w6ds54awd47awd refs/heads/SomeInfo1
    awdafawe23413f13a3r3r refs/heads/SomeInfo2
    a8wd5a8w5da78d6asawd7 refs/heads/SomeInfo3
    g9reh9wrg69egs7ef987e refs/heads/SomeInfo4

$ perl -ne ' { /.*\/(.*)/ and push(@res,"\"$1\"") } END { print "[".join(",",@res)."]\n" }' petar.txt
["SomeInfo1","SomeInfo2","SomeInfo3","SomeInfo4"]
0 голосов
/ 20 ноября 2018

Хотя вам редко следует использовать сценарий для форматирования json, в вашем случае вы просто анализируете вывод в строку через запятую с добавленными заглавными буквами [...].Вы можете использовать bash расширение параметра , чтобы избежать порождения дополнительных субоболочек для получения последнего поля информации в каждой строке следующим образом:

#!/bin/bash

[ -z "$1" -o ! -r "$1" ] && {   ## validate file given as argument
    printf "error: file doesn't exist or not readable.\n" >&2
    exit 1
}

c=0     ## simple flag variable

while read -r line; do                  ## read each line
    if [ "$c" -eq '0' ]; then           ## is flag 0?
        printf "[\"%s\"" "${line##*/}"  ## output ["last"
    else                                ## otherwise
        printf ",\"%s\"" "${line##*/}"  ## output ,"last"
    fi
    c=1         ## set flag 1
done < file     ## redirect file to loop
echo "]"        ## append closing ]

Пример использования / Вывод

Используя данные в качестве входного файла, вы получите следующее:

$ bash script.sh file
["SomeInfo1","SomeInfo2","SomeInfo3","SomeInfo4"]

Просмотрите все и дайте мне знать, если у вас есть какие-либо вопросы.

0 голосов
/ 20 ноября 2018

Вы также можете использовать awk без каких-либо циклов:

cat prev_output | awk -v ORS=',' -F'/' '{print "\042"$3"\042"}' | \
sed 's/^/[/g ; s/,$/]\n/g' > new_output

cat new_output
["SomeInfo1","SomeInfo2","SomeInfo3","SomeInfo4"]
0 голосов
/ 20 ноября 2018

Попробуйте это

# json_encoder.sh
arr=()
while read line; do
  arr+=(\"$(basename "$line")\")
done
printf "[%s]" $(IFS=,; echo "${arr[*]}")

И затем вызовите

./your_command | json_encoder.sh

PS.Я лично делаю этот вид массирования данных с Vim.

...