【问题标题】:Using grep to search for a whole word/phrase with only part使用 grep 搜索只有部分的整个单词/短语
【发布时间】:2018-08-07 09:47:29
【问题描述】:

我正在尝试使用终端命令$ diskutil info "BOOTCAMP" | grep "Node" 为我的 MacBook Pro 上的 Bootcamp 分区获取当前的“设备节点”(例如 disk0s4)。这很好用。我想创建一个对分区/卷执行一些操作的程序,因为它可能会更改节点(因为我搞砸了我的文件系统)。

因此我需要创建一个变量或存储设备节点的值(并且只有设备节点),以便以后使用它。这是我尝试过的。

$ grepVar=$(diskutil info "BOOTCAMP" | grep "Node")
$ A="$(cut -d'/' -f1 <<<"$grepVar")"
$ echo "$A hi"
   Device Node:               hi

当我运行diskutil info "BOOTCAMP" | grep "Node"时,实际文件是这样的:

Device Node: /dev/disk0s4

显然cut 剪掉了错误的部分,并保留了间距。我尝试了其他一些技术,但没有成功。有人会推荐什么? -o 方法只是给了我/dev/disk0s4 的一部分,而不是整个短语/单词。我是否只需要在“grepping”之后说出它?怎么样?

非常感谢

【问题讨论】:

  • 您能否澄清一下.. 我不确定您需要将哪个部分保存在变量中.. Device Node:/dev/disk0s4 或其他什么?

标签: terminal grep cut


【解决方案1】:

请记住,grep 是首字母缩略词。全局正则表达式打印——就像您可能在vi 中使用的命令来列出与正则表达式匹配的行。像 PCRE 这样的额外功能是不可移植的,并且可能并非在所有系统中都可用 - 甚至在没有安装软件的情况下也可以在您的系统中使用。

sed 通常提供最快或最简洁的方式来处理文本流。例如:

diskutil info "BOOTCAMP" | sed -ne '/Device Node:/s#.*/##p'

这会找到您正在查看的文本行,将所有内容剥离到最后一个斜杠,然后打印该行的其余部分。把它放在一个变量中很简单:

node=$(diskutil info "BOOTCAMP" | sed -ne '/Device Node:/s#.*/##p')

read -r node < <(diskutil info "BOOTCAMP" | sed -ne '/Device Node:/s#.*/##p')

您可以交替处理awk 中的输出,如下所示:

diskutil info "BOOTCAMP" | awk -F/ '/Device Node:/ { print $NF }'

这又一次找到您感兴趣的行,并打印最后一个字段 .. 并将字段分隔符设置为正斜杠。

如果您真的只想为此使用 grep,您可以做一些管道安装:

diskutil info "BOOTCAMP" | grep 'Device Node:' | grep -o '/[^/]*$' | grep -Eo '[^/]+'

当然,如果您愿意,最后的 grep 可以替换为 cut -d/ -f2

当然,如果BOOTCAMP 不存在,所有这些都会失败。

【讨论】:

  • 感谢您提供如此详细而深入的回答。
【解决方案2】:

在 macOS 中,您可以使用 pcregrep,例如,仅获取 disk0s4

echo "Device Node: /dev/disk0s4" | pcregrep -o "/dev/\K.*"

它会返回:

disk0s4

选项-o 用于仅显示与模式匹配的行的一部分而不是整行。

\K 可以读作排除它之前左边的所有内容,只返回右边的部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-31
    • 2017-03-20
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2012-10-13
    相关资源
    最近更新 更多