Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 筛选命令输出并将其保存在Json格式列表中的Shell脚本_Linux_Bash_Shell_String Formatting - Fatal编程技术网

Linux 筛选命令输出并将其保存在Json格式列表中的Shell脚本

Linux 筛选命令输出并将其保存在Json格式列表中的Shell脚本,linux,bash,shell,string-formatting,Linux,Bash,Shell,String Formatting,以前从未使用过shell脚本,但我需要在当前任务中使用它。 所以我必须运行一个命令,返回如下输出: awd54a7w6ds54awd47awd refs/heads/SomeInfo1 awdafawe23413f13a3r3r refs/heads/SomeInfo2 a8wd5a8w5da78d6asawd7 refs/heads/SomeInfo3 g9reh9wrg69egs7ef987e refs/heads/SomeInfo4 ["

以前从未使用过shell脚本,但我需要在当前任务中使用它。
所以我必须运行一个命令,返回如下输出:

    awd54a7w6ds54awd47awd refs/heads/SomeInfo1  
    awdafawe23413f13a3r3r refs/heads/SomeInfo2 
    a8wd5a8w5da78d6asawd7 refs/heads/SomeInfo3 
    g9reh9wrg69egs7ef987e refs/heads/SomeInfo4 
    ["SomeInfo1","SomeInfo2","SomeInfo3"]
我需要循环每一行输出,只获取“SomeInfo”部分,并将其以如下格式写入文件:

    awd54a7w6ds54awd47awd refs/heads/SomeInfo1  
    awdafawe23413f13a3r3r refs/heads/SomeInfo2 
    a8wd5a8w5da78d6asawd7 refs/heads/SomeInfo3 
    g9reh9wrg69egs7ef987e refs/heads/SomeInfo4 
    ["SomeInfo1","SomeInfo2","SomeInfo3"]
我试过这样的方法:

    for i in $(some command); do
      echo $i | cut -f2 -d"heads/" >> text.txt
    done
但我不知道如何在不使用临时文件的情况下将其格式化为数组。
很抱歉,如果这个问题很愚蠢,可能太简单了,我相信我可以自己解决,但我没有时间,因为这只是我个人想要实现的一个额外的一致性功能。

试试这个

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

./your_command | json_encoder.sh

顺便说一句,我个人用Vim做这种数据处理。

虽然您很少使用脚本来格式化json,但在您的例子中,您只是简单地将输出解析成一个逗号分隔的行,并添加了
[…]
。您可以使用bash参数展开来避免产生任何额外的子shell,以获取每行中的最后一个信息字段,如下所示:

#!/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 ]

如果您有任何问题,请仔细查看并告诉我。

您也可以使用不带任何循环的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"]
使用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"]