示例:

1.有一个example.txt文件,文件内容如下:

{“err_code”:200,"err_msg":"this is no error", “status”:1, “dev_name”:“mylinux”, “dev_id”:123}

7ed6ca555df40d3c49c7c7798a6596df.png

2.如果我们想要获取dev_id字段的值,可以在命令行下使用如下一行命令:

cat example.txt | sed 's/,/\n/g' | grep "dev_id" | sed 's/:/\n/g' | sed '1d' | sed 's/}//g'

80a26a4a66e399e543a10bec54c7db26.png

命令解释:

(1)第一个sed命令的意思是将json数据中的“,”替换为换行符“\n”,这样该串数据就变为每一行一个字段的内容,即按逗号分隔数据串。

e1da2e016897bb8bec93a61b5acce6ba.png

(2)第二个grep命令的意思是查找“dev_id”关键字,并单列出来。

948dfaea250f75c75dbf021dc43d8864.png

(3)第三个sed命令的意思是将(2)中的结果再次按冒号“:”进行分隔。

adc66fa6a40feebd4595c444b0ea762c.png

(4)第四个sed命令的意思是将(3)中的结果,删除第一行内容,即删除“dev_id”行。

407639bdc3692fba9356024e699e3718.png

(5)最后一个sed命令的意思是将最后的花括号“}”用空字符替换,最终得到我们想要的值。

ed6983a3556a4a31ffa6aba3dba45075.png

3.如果我们想要获取dev_name字段的值,可以在命令行下使用如下一行命令:

cat example.txt | sed 's/,/\n/g' | grep "dev_name" | sed 's/:/\n/g' | sed '1d' | sed 's/"//g'

3b41ac9c83865b390b0dc9c6bdbc3fdc.png

命令解释:

前面四个sed、grep命令见上面的解释。

5badd8f0d227bcb70f6938d868f5b7af.png

由于前面四个命令我们得到的结果为“mylinux”,因此需要将其中的引号去掉才是我们最终想要的结果mylinux。

sed 's/"//g' 的意思是将前面的结果中的引号“”用空字符代替,最后的g参数表示替换所有符合的引号“”。

4.如果我们想把上述结果存进变量里使用的话,可以使用下面的命令:

dev_id=$(cat example.txt | sed 's/,/\n/g' | grep "dev_id" | sed 's/:/\n/g' | sed '1d' | sed 's/}//g')
echo $dev_id

7ad4c86067c7a4a640169a8cac451853.png

同样的,对于dev_name字段,有如下命令:

dev_name=$(cat example.txt | sed 's/,/\n/g' | grep "dev_id" | sed 's/:/\n/g' | sed '1d' | sed 's/}//g')
echo $dev_name

824c0476a6a90c255c3ef3f8ed9de12d.png

5.后记

以上仅为本人的一种实现方式,由于刚开始接触shell,对于grep以及sed的理解还不深入,写在这里也是用于记录,免得日后忘了。上面的实现方式可能比较麻烦,如果大家有更好的方法的话,欢迎留言讨论。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐