我想以不带双引号的字符串形式获得以下命令的正确值。
$ 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
解释:简单的解释是,使用awk
的match
函数来匹配起始版本="直到下一次出现"
,然后打印匹配的部分(根据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