说我有一个文件:
# file: 'test.txt'
foobar bash 1
bash
foobar happy
foobar
Run Code Online (Sandbox Code Playgroud)
我只想知道“foobar”后面出现什么词,所以我可以使用这个正则表达式:
"foobar \(\w\+\)"
Run Code Online (Sandbox Code Playgroud)
括号表示我对 foobar 后面的单词特别感兴趣。但是当我执行 a 时grep "foobar \(\w\+\)" test.txt
,我得到了与整个正则表达式匹配的整行,而不仅仅是“foobar 之后的单词”:
foobar bash 1
foobar happy
Run Code Online (Sandbox Code Playgroud)
我更希望该命令的输出如下所示:
bash
happy
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉 grep 只输出与正则表达式中的分组(或特定分组)匹配的项目?
我正在开发一个简单的 bash 脚本,它应该能够在 Ubuntu 和 CentOS 发行版上运行(对 Debian 和 Fedora/RHEL 的支持将是一个加分项),我需要知道脚本正在运行的发行版的名称和版本(以触发特定操作,例如创建存储库)。到目前为止,我所得到的是:
OS=$(awk '/DISTRIB_ID=/' /etc/*-release | sed 's/DISTRIB_ID=//' | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/')
VERSION=$(awk '/DISTRIB_RELEASE=/' /etc/*-release | sed 's/DISTRIB_RELEASE=//' | sed 's/[.]0/./')
if [ -z "$OS" ]; then
OS=$(awk '{print $1}' /etc/*-release | tr '[:upper:]' '[:lower:]')
fi
if [ -z "$VERSION" ]; then
VERSION=$(awk '{print $3}' /etc/*-release)
fi
echo $OS
echo $ARCH
echo $VERSION
Run Code Online (Sandbox Code Playgroud)
这似乎有效,返回ubuntu
或centos
(我没有尝试过其他人)作为发布名称。但是,我有一种感觉,必须有一种更简单、更可靠的方法来解决这个问题——这是真的吗?
它不适用于 RedHat。/etc/redhat-release 包含:Redhat Linux 企业版 5.5 …
在我的 Fedora 19 系统上,我可以使用hostnamectl
. 这允许我设置一些东西,例如静态(正常)主机名,以及一个“漂亮”的主机名。
是否有一个简单的命令可以从 bash 提示符中检索漂亮的主机名?
hostname
返回静态主机名,手册页没有显示恢复漂亮主机名的选项。