linux 如何使用awk只匹配给定的字符串而不匹配其他任何内容

mhd8tkvw  于 2022-12-18  发布在  Linux
关注(0)|答案(4)|浏览(189)

我有一个文件包含这些内容

NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

我只需要awkID="centos"部分。我尝试:

awk /ID=/{print} file.txt

但这会同时给出ID="centos"VERSION_ID="7"输出
如何仅awk模式中给定的字符串?

cidc1ykv

cidc1ykv1#

请尝试以下操作(也可以使用grep,因为问题是关于awk的,所以请使用它)。

awk '/^ID="/' Input_file
  • 使用锚^检查线是否从ID=开始。
  • 然后添加ID="以确保它只匹配ID=字符串,而不是其他任何字符串。
  • 为什么字符串VERSION_ID=不会匹配,因为它不是从ID开始,它包含ID,这就是为什么我们在条件检查中使用^
  • awk作用于pattern/condition的方法,然后作用于action,因此此处未提及任何操作,这就是将打印当前行的默认操作的原因。
nlejzf6q

nlejzf6q2#

如果愿意,您可以使用awk,但此作业的常规工具只是grep,其中的REGEX锚定在行的开头,例如。

$ grep '^ID=' /etc/os-release
ID="centos"

(that并不意味着使用awk有什么问题,但通常在这里您会认为是grep。我假设您正在解析的文件是/etc/os-release

lyfkaqu1

lyfkaqu13#

使用此选项进行精确匹配:

$ awk -F= '$1=="ID"' file

输出:

ID="centos"

如果需要字段分隔符为其他内容,请用途:

$ awk 'split($0,a,/=/)&&a[1]=="ID"' file
f0ofjuux

f0ofjuux4#

您的awk代码与^完美匹配:

awk /^ID=/{print} file
ID="centos"

相关问题