问题描述
我正在尝试在 linux 上获取挂载点及其各自的路径。所以当我运行 mount -v
命令时,我得到了这个示例输出
//cifst/FSR on /mnt/share/cifst/FSR type cifs ...
//sydatsttbsq01/TheBooks statements to be parsed on /mnt/share/TheBooks type cifs ...
/mnt/share/cifst/FSR;//cifst/FSR
/mnt/share/TheBooks;//sydatsttbsq01/TheBooks
但第一行的 /mnt
位于第 3 列,而第二行的 /mnt
位于第 5 列,所以我该如何获取 mount -v | grep mnt | awk '{ print $1'}
部分
解决方法
对于这个特定的输出,这样的事情会起作用;请记住,如果您使用的任何带空格的路径中包含“on”一词,它就会中断。
mount -v | awk 'BEGIN{FS="( on | type )"; OFS=";"} $3 ~ /cifs/ {print $2,$1}'
/mnt/share/cifst/FSR;//cifst/FSR
/mnt/share/TheBooks;//sydatsttbsq01/TheBooks statements to be parsed
PS:如果您不在路径中使用空格,将它们替换为 .
或 _
,或者驼峰命名法,那么您的情况会好多了。 .
很多假设,但这适用于您的示例输入/输出:
$ cat << EOF | awk '{print $(NF-2),$1}' OFS=\;
> //cifst/FSR on /mnt/share/cifst/FSR type cifs
> //sydatsttbsq01/TheBooks statements to be parsed on /mnt/share/TheBooks type cifs
> EOF
/mnt/share/cifst/FSR;//cifst/FSR
/mnt/share/TheBooks;//sydatsttbsq01/TheBooks
诀窍是注意它不是您感兴趣的第 3 列和第 5 列,而是在每种情况下都是第 NF - 2 列。
在这种特殊情况下,grep
是多余的,因为它匹配输入的每一行,并且通常 grep
与 awk
(几乎)总是冗余的。如果您需要添加过滤器,请使用 awk 并使用:
awk '/mnt/{print $(NF-2),$1}' OFS=\;
,
这行得通吗?
mount -v | grep mnt | awk '{ print $(NF-3)";"$1 }'
,
如果您感兴趣的字段是 #1 并且第一个字段之后的下一个字段等于“on
”,并且它们不包含空格,您可以试试这个:
mount -v | awk '{a="";for(i=2;i<=NF;i++){if(a=="on")break;a=$i};print $i";"$1}'
如果我们再添加一个假设,即只有一个字段等于“on
”,另一种可能是使用gensub
:
mount -v | awk '{print gensub(/^(\S+).*\<on\>\s+(\S+).*/,"\\2;\\1",1)}'
这给我们带来了一个 sed 等价物:
mount -v | sed -r 's/^(\S+).*\<on\>\s+(\S+).*/\2;\1/'