grep - 使用 grep 捕获操作系统名称

标签 grep sh

在使用 grep 时我可以这样做:

$ cat /etc/os-release|grep "NAME="
NAME="Ubuntu"
PRETTY_NAME="Ubuntu 14.04.3 LTS"

有没有办法获取名称的捕获组?例如,类似:

$ cat /etc/os-release|grep -P '^NAME="(.+)"$'
NAME="Ubuntu" # <-- how to just get 'Ubuntu' ?

我想一个选择是这样的?但这似乎有点矫枉过正:

$ cat /etc/os-release|grep -P '(?<=^NAME=")[^"]+'

enter image description here

最佳答案

/etc/os-release 被设计为可获取的。只需使用:

. /etc/os-release; echo "$NAME"

中的点。/etc/os-release 告诉 shell source 该文件。这意味着文件中的命令将像在当前 shell 中一样运行。

bashzshksh等中,我们可以使用source/etc/os-release 代替 。/etc/os-release.然而,source 关键字不是 POSIX 标准的一部分,因此不可移植。特别是,dash 不支持 source,并且 dash 是许多发行版上的默认 /bin/sh

采购与执行

我们还可以执行该文件:

sh /etc/os-release; echo "$NAME"

但是,这意味着 /etc/os-release 中的命令是在子进程中执行的,当子进程退出时,所有环境更改都会立即丢失。这意味着,在我们的过程中,变量NAME不会发生变化。这就是为什么在这种情况下,我们使用采购而不是执行。

关于grep - 使用 grep 捕获操作系统名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62906289/

相关文章:

bash - 如何在 bash 中提示是或否?

linux - 删除shell中一行的最后一个字

linux - 无法在 VPS 上运行 CRON 作业

bash - 有没有一种简单的方法可以将 "raw"字符串传递给 grep?

c - 是否可以将 GNU grep 作为库移植?

regex - 需要使用正则表达式过滤掉有效的 IP 地址

shell - Bourne shell 脚本读取文件

shell - Shell中如何获取一个字符串在另一个字符串中的行号

linux - 从文件中读取模式,grep 仅第一次出现

linux - 在 linux 中使用 shell 脚本从单词中读取特定字符