使用 grep 或 awk 获取字符串的第二个值

使用 grep 或 awk 获取字符串的第二个值

在 bash 中,我从文件中读取一个字符串,如下所示:

"network": "Purple",

我将如何使用 grep、awk 甚至 sed 只提取字符串:“Purple”(不带引号)并将其分配给变量?

我需要去掉末尾的引号和逗号。

在某些情况下,它可能不包含“紫色”一词,但可能是其他颜色,但始终是单个单词。

我一直在尝试以下代码,但无法使其完美。

#!/bin/bash

NETWORK=`cat generalInfo.info | grep network | awk '{print $2}'`

if [ $NETWORK -eq "Purple" ]; then
    echo "This network is Purple"
else
    echo "This network is not Purple"
fi

exit 0

到目前为止,这段代码让我得到“紫色”,但需要去掉周围的引号和逗号。使用双引号作为 awk 的分隔符会更容易吗?

GeneralInfo.info 文件只是一个类似 json 格式的文本文件。我读过,我可以使用 jq 来解析文件,但在我的特定实例中,我没有安装 jq 并且无法安装它。

谢谢你的帮助。

答案1

有很多方法可以做到这一点。但是,正如评论中已经提到的,如果这实际上是结构化 JSON 数据,您可能需要研究类似jq旨在解析 JSON 的内容。

对于您提到的简单情况,这里有几个选项:

  1. awk

     $ echo '"network": "Purple",' | awk '/network/{ gsub(/[",]/,"",$2); print $2}'
     Purple
    
  2. GNU grep

     $ echo '"network": "Purple",' | grep -oP '"network":\s*"\K[^"]+'
     Purple
    
  3. sed

     $ echo '"network": "Purple",' | sed -n 's/"network": *"\([^"]*\).*/\1/p'
     Purple
    

    或者

     $ echo '"network": "Purple",' | sed -En 's/"network":\s*"([^"]+).*/\1/p'
     Purple
    

最后,尽量避免在 shell 脚本中使用全大写变量名。按照惯例,全局环境变量都是大写的,如果您自己的变量名也大写,这可能会导致混乱。在脚本的特定情况下,您甚至不需要变量。我会像这样重写你的脚本:

#!/bin/bash

grep -q 'network.*Purple' generalInfo.info &&
    echo "This network is Purple" ||
    echo "This network is not Purple"

您不需要cat为了grep它而创建文件,也不需要在变量中存储某些内容来检查它是否存在。

答案2

sed可以试试这个:

sed 's/^.*: "\(.*\)",$/\1/' generalInfo.info

这个变体cut

cut -d'"' -f4 generalInfo.info

grep

grep -Po '(?<=": ").*(?=",)' generalInfo.info

答案3

$ var=$(awk -F'"' '$2=="network"{print $4}' file)
$ echo "$var"
Purple

相关内容