使用grep从控制台中提取文本。我究竟做错了什么?

时间:2014-08-27 07:41:34

标签: bash shell grep

在Bash控制台上运行文件test.sh后,我有以下输出

{ "id" : "0cba-2dbc-11e4-8c2c-bb68" }

我想使用grep或egrep命令获取id的值。这是我到目前为止所尝试的:

test.sh | grep -E "(: \".*\" })"

这只是打印出与上面相同的输出。接下来我尝试通过在我想要保存的值周围添加括号(.*)进行分组:

test.sh | grep -E "(: \"(.*)\" })"

但我仍然以相同的结果结束。

有没有办法获得价值:0cba-2dbc-11e4-8c2c-bb68不使用python打印?

5 个答案:

答案 0 :(得分:4)

您应该使用足够的工具来处理JSON数据,例如 jq(轻量级和灵活的命令行JSON处理器)尝试使用{{1}解析JSON } / awk / grep总是一个坏主意,因为他们不会理解" JSON格式。

sed

答案 1 :(得分:3)

您需要-o选项,请尝试以下行:

grep -Po '"id"\s*:\s*"\K[^"]*'

这里的\K就像一样。它支持不固定数量的字符。所以,把它翻译成英文:

-o)在"id" (any number of spaces):(any number of spaces)"之后向我提供文字,直至下一个"。这是你的id值。

-P表示使用PCRE

答案 2 :(得分:1)

只需将输出传输到:

some-command | awk -F '[{}: ]+' '{gsub(/"/, "")} $2=="id"{print $3}'
0cba-2dbc-11e4-8c2c-bb68

答案 3 :(得分:1)

另一个awk

echo '{ "id" : "0cba-2dbc-11e4-8c2c-bb68" }' | awk -F\" '$2=="id" {print $4}'
0cba-2dbc-11e4-8c2c-bb68

答案 4 :(得分:0)

另一种方法。

echo '{ "id" : "0cba-2dbc-11e4-8c2c-bb68" }' | awk '{print $4}' | sed 's/["]//g'

返回

0cba-2dbc-11e4-8c2c-bb68