我试图使用终端命令$ 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
的一部分,而不是整个短语/单词。在“抓住”它之后,我只需要说一下它吗?怎么样?
一吨
答案 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
理解为排除在它左边的所有内容,只返回右边的部分。