使用 awk 打印不带双引号
Using awk to print without double quotes
我想获取以下命令的正确值作为不带双引号的字符串。
$ grep '^VERSION=' /etc/os-release
VERSION="20.04.3 LTS (Focal Fossa)"
当我使用以下 awk
对其进行管道传输时,我没有得到所需的输出。
$ grep '^VERSION=' /etc/os-release | awk '{print [=11=]}'
VERSION="20.04.3 LTS (Focal Fossa)"
$ grep '^VERSION=' /etc/os-release | awk '{print }'
VERSION="20.04.3
$ grep '^VERSION=' /etc/os-release | awk '{print }'
LTS
我该如何解决?
您可以使用这个 awk 命令:
awk -F= '=="VERSION" {gsub(/"/, "", ); print }' /etc/os-release
20.04.3 LTS (Focal Fossa)
您可以使用 awk
命令,例如
awk 'match([=10=], /^VERSION="([^"]*)"/, m) {print m[1]}' /etc/os-release
此处,^VERSION="([^"]*)"
匹配字符串开头的 VERSION="
(^
),然后将 "
以外的任何零个或多个字符捕获到第 1 组中(与 ([^"]*)
),然后匹配 "
。匹配项保存在 m
中,其中 m[1]
包含第 1 组值。
或者,sed like
sed -n '/^VERSION="\([^"]*\)".*/s///p' /etc/os-release
看到 online test:
s='VERSION="20.04.3 LTS (Focal Fossa)"'
awk 'match([=12=], /^VERSION="([^"]*)"/, m) {print m[1]}' <<< "$s"
sed -n '/^VERSION="\([^"]*\)".*/s///p' <<< "$s"
此处,-n
选项抑制默认行输出,/^VERSION="\([^"]*\)".*/
匹配以 VERSION="
开头的字符串,然后将 [=17 以外的任何零个或多个字符捕获到组 1 中=],然后匹配 "
和字符串的其余部分,并将整个匹配替换为第 1 组值。 //
表示必须使用之前的正则表达式模式。 p
只打印替换的结果。
两者输出20.04.3 LTS (Focal Fossa)
.
第一个解决方案:使用您显示的示例,请尝试遵循 awk
代码。
awk 'match([=10=],/^VERSION="[^"]*/){print substr([=10=],RSTART+9,RLENGTH-9)' Input_file
解释: 简单的解释就是,使用awk
的match
函数来匹配开始的VERSION= " 直到 "
的下一次出现,然后打印匹配的部分(根据 OP 显示的示例仅获得所需的输出)。
第二个解决方案: 使用 GNU grep
启用 PCRE 正则表达式选项尝试以下操作。
grep -oP '^VERSION="\K[^"]*' Input_file
第三种解决方案:使用awk
设置不同字段分隔符的能力,然后相应地检查条件并打印值.
awk -F'"' '=="VERSION="{print }' Input_file
假设您想要输出的“正确值”是 20.04.3
:
$ awk -F'[" ]' '/^VERSION=/{print }' file
20.04.3
或者如果它是整个引用字符串:
$ awk -F'"' '/^VERSION=/{print }' file
20.04.3 LTS (Focal Fossa)
由于文件 /etc/os-release 符合 bash 或一般 shell 中的变量赋值 (POSIX),因此采购它应该可以完成工作。
source /etc/os-release; echo "$VERSION"
使用 subshell 以防万一不希望污染当前环境变量。
( 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
我想获取以下命令的正确值作为不带双引号的字符串。
$ grep '^VERSION=' /etc/os-release
VERSION="20.04.3 LTS (Focal Fossa)"
当我使用以下 awk
对其进行管道传输时,我没有得到所需的输出。
$ grep '^VERSION=' /etc/os-release | awk '{print [=11=]}'
VERSION="20.04.3 LTS (Focal Fossa)"
$ grep '^VERSION=' /etc/os-release | awk '{print }'
VERSION="20.04.3
$ grep '^VERSION=' /etc/os-release | awk '{print }'
LTS
我该如何解决?
您可以使用这个 awk 命令:
awk -F= '=="VERSION" {gsub(/"/, "", ); print }' /etc/os-release
20.04.3 LTS (Focal Fossa)
您可以使用 awk
命令,例如
awk 'match([=10=], /^VERSION="([^"]*)"/, m) {print m[1]}' /etc/os-release
此处,^VERSION="([^"]*)"
匹配字符串开头的 VERSION="
(^
),然后将 "
以外的任何零个或多个字符捕获到第 1 组中(与 ([^"]*)
),然后匹配 "
。匹配项保存在 m
中,其中 m[1]
包含第 1 组值。
或者,sed like
sed -n '/^VERSION="\([^"]*\)".*/s///p' /etc/os-release
看到 online test:
s='VERSION="20.04.3 LTS (Focal Fossa)"'
awk 'match([=12=], /^VERSION="([^"]*)"/, m) {print m[1]}' <<< "$s"
sed -n '/^VERSION="\([^"]*\)".*/s///p' <<< "$s"
此处,-n
选项抑制默认行输出,/^VERSION="\([^"]*\)".*/
匹配以 VERSION="
开头的字符串,然后将 [=17 以外的任何零个或多个字符捕获到组 1 中=],然后匹配 "
和字符串的其余部分,并将整个匹配替换为第 1 组值。 //
表示必须使用之前的正则表达式模式。 p
只打印替换的结果。
两者输出20.04.3 LTS (Focal Fossa)
.
第一个解决方案:使用您显示的示例,请尝试遵循 awk
代码。
awk 'match([=10=],/^VERSION="[^"]*/){print substr([=10=],RSTART+9,RLENGTH-9)' Input_file
解释: 简单的解释就是,使用awk
的match
函数来匹配开始的VERSION= " 直到 "
的下一次出现,然后打印匹配的部分(根据 OP 显示的示例仅获得所需的输出)。
第二个解决方案: 使用 GNU grep
启用 PCRE 正则表达式选项尝试以下操作。
grep -oP '^VERSION="\K[^"]*' Input_file
第三种解决方案:使用awk
设置不同字段分隔符的能力,然后相应地检查条件并打印值.
awk -F'"' '=="VERSION="{print }' Input_file
假设您想要输出的“正确值”是 20.04.3
:
$ awk -F'[" ]' '/^VERSION=/{print }' file
20.04.3
或者如果它是整个引用字符串:
$ awk -F'"' '/^VERSION=/{print }' file
20.04.3 LTS (Focal Fossa)
由于文件 /etc/os-release 符合 bash 或一般 shell 中的变量赋值 (POSIX),因此采购它应该可以完成工作。
source /etc/os-release; echo "$VERSION"
使用 subshell 以防万一不希望污染当前环境变量。
( 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