使用awk打印不带双引号

  • 本文关键字:awk 打印 使用 awk
  • 更新时间 :
  • 英文 :


我想以不带双引号的字符串形式获得以下命令的正确值。

$ grep '^VERSION=' /etc/os-release
VERSION="20.04.3 LTS (Focal Fossa)"

当我用下面的awk管道它时,我没有得到想要的输出。

$ grep '^VERSION=' /etc/os-release | awk '{print $0}'
VERSION="20.04.3 LTS (Focal Fossa)"
$ grep '^VERSION=' /etc/os-release | awk '{print $1}'
VERSION="20.04.3
$ grep '^VERSION=' /etc/os-release | awk '{print $2}'
LTS

我怎样才能解决这个问题?

您可以使用这个awk命令:

awk -F= '$1=="VERSION" {gsub(/"/, "", $2); print $2}' /etc/os-release
20.04.3 LTS (Focal Fossa)

解决方案1: 对于所显示的示例,请尝试遵循awk代码。

awk 'match($0,/^VERSION="[^"]*/){print substr($0,RSTART+9,RLENGTH-9)' Input_file

解释:简单的解释是,使用awkmatch函数来匹配起始版本="直到下一次出现",然后打印匹配的部分(根据OP显示的示例只获得所需的输出)。



解决方案2:使用GNUgrep与PCRE regex启用选项尝试以下

grep -oP '^VERSION="K[^"]*' Input_file


3的解决方案:使用awk的功能设置不同的字段分隔符,然后相应地检查条件并打印值。

awk -F'"' '$1=="VERSION="{print $2}'  Input_file

假设"正确的值";你想要的输出是20.04.3:

$ awk -F'[" ]' '/^VERSION=/{print $2}' file
20.04.3

或者整个带引号的字符串:

$ awk -F'"' '/^VERSION=/{print $2}' file
20.04.3 LTS (Focal Fossa)

您可以使用awk命令,如

awk 'match($0, /^VERSION="([^"]*)"/, m) {print m[1]}' /etc/os-release

这里,^VERSION="([^"]*)"匹配字符串开头的VERSION="(^),然后将"(([^"]*))以外的任何零或多个字符捕获到组1中,然后匹配"。匹配保存在m中,其中m[1]保存Group 1的值。

或者,像

sed -n '/^VERSION="([^"]*)".*/s//1/p' /etc/os-release

查看在线测试:

s='VERSION="20.04.3 LTS (Focal Fossa)"'
awk 'match($0, /^VERSION="([^"]*)"/, m) {print m[1]}' <<< "$s"
sed -n '/^VERSION="([^"]*)".*/s//1/p' <<< "$s"

这里,-n选项抑制默认行输出,/^VERSION="([^"]*)".*/匹配以VERSION="开头的字符串,然后捕获"以外的任何零或多个字符到第1组,然后匹配"和字符串的其余部分,并用第1组的值替换整个匹配。//表示必须使用之前的正则表达式模式。p只输出替换的结果。

均输出20.04.3 LTS (Focal Fossa).

由于/etc/os-release文件符合bash或shell (POSIX)中的变量赋值,因此查找它应该可以完成这项工作。

source /etc/os-release; echo "$VERSION"

使用子shell只是为了避免污染当前的环境变量。

( source /etc/os-release; echo "$VERSION" )

赋值给变量

version=$( source /etc/os-release; echo "$VERSION" )

如果你使用的shell不符合POSIX.

sh -c '. /etc/os-release; echo "$VERSION"'

查看本地手册页,如果有的话。

man 5 os-release

最新更新