Shell 过滤命令输出并将其保存在 Json 格式列表中的脚本
Shell script that filters command output and saves it in Json formated list
以前从未使用过 shell 脚本,但我需要在当前任务中使用。
所以我必须 运行 一个 returns 输出这样的命令:
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
但我不知道如何在不使用临时文件的情况下将其格式化为数组。
抱歉,如果这个问题很愚蠢而且可能太简单了,我确定我可以自己解决,但我只是没有时间,因为它只是我个人想要实现的一个额外的便利功能。
试试这个
# json_encoder.sh
arr=()
while read line; do
arr+=(\"$(basename "$line")\")
done
printf "[%s]" $(IFS=,; echo "${arr[*]}")
然后调用
./your_command | json_encoder.sh
PS。我个人使用 Vim.
进行这种数据按摩
虽然您应该很少使用脚本来格式化 json,但在您的情况下,您只是将输出解析为以逗号分隔的行,并添加了 [...]
的结尾大写字母。您可以使用 bash 参数扩展 来避免产生任何额外的子 shell 以获取每行中的最后一个信息字段,如下所示:
#!/bin/bash
[ -z "" -o ! -r "" ] && { ## 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 ]
例子Use/Output
使用您给定的数据作为输入文件,您将得到以下内容:
$ bash script.sh file
["SomeInfo1","SomeInfo2","SomeInfo3","SomeInfo4"]
检查一下,如果您有任何问题,请告诉我。
你也可以在没有任何循环的情况下使用 awk 我猜:
cat prev_output | awk -v ORS=',' -F'/' '{print "2""2"}' | \
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,"\"\"") } END { print "[".join(",",@res)."]\n" }' petar.txt
["SomeInfo1","SomeInfo2","SomeInfo3","SomeInfo4"]
以前从未使用过 shell 脚本,但我需要在当前任务中使用。
所以我必须 运行 一个 returns 输出这样的命令:
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
但我不知道如何在不使用临时文件的情况下将其格式化为数组。
抱歉,如果这个问题很愚蠢而且可能太简单了,我确定我可以自己解决,但我只是没有时间,因为它只是我个人想要实现的一个额外的便利功能。
试试这个
# json_encoder.sh
arr=()
while read line; do
arr+=(\"$(basename "$line")\")
done
printf "[%s]" $(IFS=,; echo "${arr[*]}")
然后调用
./your_command | json_encoder.sh
PS。我个人使用 Vim.
进行这种数据按摩虽然您应该很少使用脚本来格式化 json,但在您的情况下,您只是将输出解析为以逗号分隔的行,并添加了 [...]
的结尾大写字母。您可以使用 bash 参数扩展 来避免产生任何额外的子 shell 以获取每行中的最后一个信息字段,如下所示:
#!/bin/bash
[ -z "" -o ! -r "" ] && { ## 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 ]
例子Use/Output
使用您给定的数据作为输入文件,您将得到以下内容:
$ bash script.sh file
["SomeInfo1","SomeInfo2","SomeInfo3","SomeInfo4"]
检查一下,如果您有任何问题,请告诉我。
你也可以在没有任何循环的情况下使用 awk 我猜:
cat prev_output | awk -v ORS=',' -F'/' '{print "2""2"}' | \
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,"\"\"") } END { print "[".join(",",@res)."]\n" }' petar.txt
["SomeInfo1","SomeInfo2","SomeInfo3","SomeInfo4"]