使用grep仅搜索一部分

时间:2018-08-07 09:47:29

标签: terminal grep cut

我试图使用终端命令$ 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的一部分,而不是整个短语/单词。在“抓住”它之后,我只需要说一下它吗?怎么样?

一吨

2 个答案:

答案 0 :(得分: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不存在,所有这些都会失败。

答案 1 :(得分:0)

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

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

它将返回:

disk0s4

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

可以将\K理解为排除在它左边的所有内容,只返回右边的部分。